課題

以下の指標の中から、一つを選択して、データの概要(description)を記録し、データを WDI で取得し、以下の分析をする。

  1. 各年毎のデータの数の棒グラフ
  2. 日本のデータの年の降順での表示
  3. 経年変化を表す折れ線グラフ
    1. 日本
    2. 南部アフリカ関税同盟の5カ国
    3. 選択したいくつかの国
  4. データが十分ある最近の年の値のヒストグラム
  5. データが十分ある最近の年の値の10カ国の値の棒グラフ
    1. 値が大きい方から
    2. 値が小さい方から

それぞれについて考察(気づいたこと、疑問など)を記す

2023.1.25. 23:59 までに Moodle の演習の課題ボックスに提出したものについては、なるべく、早く見て、フィードバックを書きます。それ以降に提出されたものも見ますが、フィードバックは遅くなると思ってください。

データ

  1. Government expenditure on education, total (% of GDP):SE.XPD.TOTL.GD.ZS [Link]

  2. School enrollment, primary (% gross):SE.PRM.ENRR [Link]

  3. School enrollment, secondary (% gross):SE.SEC.ENRR [Link]

  4. School enrollment, tertiary (% gross):SE.TER.ENRR [Link]

  5. Mortality rate, under-5 (per 1,000 live births):SH.DYN.MORT [Link]

  6. School enrollment, primary and secondary (gross), gender parity index (GPI):SE.ENR.PRSC.FM.ZS [Link]

  7. Ratio of female to male labor force participation rate (%) (modeled ILO estimate):SL.TLF.CACT.FM.ZS [Link]

  8. Unemployment, female (% of female labor force) (modeled ILO estimate):SL.UEM.TOTL.FE.ZS [Link]

  9. Unemployment, male (% of male labor force) (modeled ILO estimate):SL.UEM.TOTL.MA.ZS [Link]

  10. Net official development assistance and official aid received (current US$) DT.ODA.ALLD.CD [Link]

1. 国の教育に関する支出

概要:国内総生産(GDP)に対する、国の教育に関する支出(Government expenditure on education, total (% of GDP))のデータの分析を行う

データ

データ情報

  • Government expenditure on education, total (% of GDP):SE.XPD.TOTL.GD.ZS [Link]

  • データ名:国の教育関連支出(GDP比 %)

  • データコード:SE.XPD.TOTL.GD.ZS

  • 変数名:ed_exp

  • 概要:教育に対する政府の一般支出(経常、資本、移転)は GDP の割合で表されます。これには、国際資金源から政府への送金によって資金提供された支出が含まれます。一般政府とは通常、地方自治体、地域政府、中央政府を指します。

データの取得

準備

library(tidyverse)
library(WDI)

WDI パッケージを使って、直接データをダウンロードし、変数名を、ed_exp に指定。

df_ed_exp <- WDI(indicator = c(ed_exp = "SE.XPD.TOTL.GD.ZS"))
write_csv(df_ed_exp, "data/ed_exp.csv")
df_ed_exp <- read_csv("data/ed_exp.csv")
Rows: 16758 Columns: 5── Column specification ──────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): country, iso2c, iso3c
dbl (2): year, ed_exp
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

データの確認

df_ed_exp
str(df_ed_exp)
spc_tbl_ [16,758 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ country: chr [1:16758] "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" ...
 $ iso2c  : chr [1:16758] "ZH" "ZH" "ZH" "ZH" ...
 $ iso3c  : chr [1:16758] "AFE" "AFE" "AFE" "AFE" ...
 $ year   : num [1:16758] 2022 2021 2020 2019 2018 ...
 $ ed_exp : num [1:16758] 3.91 4.63 4.35 4.54 4.74 ...
 - attr(*, "spec")=
  .. cols(
  ..   country = col_character(),
  ..   iso2c = col_character(),
  ..   iso3c = col_character(),
  ..   year = col_double(),
  ..   ed_exp = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 
REGION <- c("1A", "1W", "4E", "7E", "8S", "B8", "EU", "F1", "OE", "S1", 
"S2", "S3", "S4", "T2", "T3", "T4", "T5", "T6", "T7", "V1", "V2", 
"V3", "V4", "XC", "XD", "XE", "XF", "XG", "XH", "XI", "XJ", "XL", 
"XM", "XN", "XO", "XP", "XQ", "XT", "XU", "XY", "Z4", "Z7", "ZF", 
"ZG", "ZH", "ZI", "ZJ", "ZQ", "ZT")
df_ed_exp |> filter(iso2c %in% REGION) |> distinct(country, iso2c)
df_ed_exp |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c)

分析する国のリスト

南部アフリカ関税同盟 The Southern African Customs Union (SACU)

SOUTH_AFRICA_FIVE <- c("South Africa", "Namibia", "Eswatini", "Botswana", "Lesotho")

ラテンアメリカでジニ指数が大きい4カ国

CHOSEN_COUNTRIES <- c("Suriname", "Belize", "Brazil", "Colombia")

分析

1. 各年毎のデータの数の棒グラフ

df_ed_exp |> drop_na(ed_exp) |> filter(!(iso2c %in% REGION)) |>
  ggplot(aes(year)) + geom_bar()

視覚化

2. 日本の教育費(% of GDP)

df_ed_exp |> filter(country == "Japan") |> 
  drop_na(ed_exp) |> arrange(desc(year))

3. 経年変化

a. 日本

df_ed_exp |> filter(country == "Japan") |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line()

気づいたこと・疑問

  • 1970年代の急激な上昇、1990年ごろの急激な現象は、何が原因なのだろう。

  • 2014年ごろから減少、2018年ごろから増加、2020年から2021年は減少。

b. 南部アフリカ関税同盟

df_ed_exp |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_ed_exp |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

気づいたこと・疑問

  • 平均で見ると、上昇してきており、7% 程度という大きな割合になっている。

c. ラテンアメリカ4カ国

df_ed_exp |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_ed_exp |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

分布

データの数から、まずは、2020年について見てみる。

df_ed_exp |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(ed_exp) |>
  ggplot(aes(ed_exp)) + geom_histogram(binwidth = 1)

参考:SACU の5カ国の値を縦線で書き込むには下のようにします。

df_ed_exp |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) 

参考:日本とSACU の5カ国の値を縦線で書き込むには下のようにします。

JP <- 3.416981
SAF <- df_ed_exp |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) |> pull(ed_exp)
df_ed_exp |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(ed_exp) |>
  ggplot() + geom_histogram(aes(ed_exp), binwidth = 1) +
  geom_vline(xintercept = SAF, col = "red") + geom_vline(xintercept = JP, col = "blue") +labs(title = "2020年の教育費の対GDP百分率", subtitle = "日本:青、SACU:赤")

データが十分ある最近の年の値の10カ国の値の棒グラフ

a. 値が大きい方から

df_ed_exp |> filter(year == 2020) |> drop_na(ed_exp) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(desc(ed_exp)) |> head(10) |> 
  ggplot(aes(fct_reorder(country, ed_exp), ed_exp)) + geom_col() + 
  coord_flip() + labs(title = "Top 10 Countries", x = "country", y = "Government expenditure on education, total (% of GDP)")

b. 値が小さい方から

df_ed_exp |> filter(year == 2020) |> drop_na(ed_exp) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(ed_exp) |> head(10) |> 
  ggplot(aes(fct_rev(fct_reorder(country, ed_exp)), ed_exp)) + geom_col() + 
  coord_flip() + labs(title = "Lowest 10 Countries", x = "country", y = "Government expenditure on education, total (% of GDP)")

2. 初等学校就学率

データ

  • School enrollment, primary (% gross):SE.PRM.ENRR [Link]

データ情報

  • データ名:

  • データコード:

  • 変数名:

  • 概要:

データの取得

準備

library(tidyverse)
library(WDI)

WDI パッケージを使って、直接データをダウンロードし、変数名を、ed_exp に指定。

df_primary <- WDI(indicator = c(primary = "SE.PRM.ENRR"))
write_csv(df_primary, "data/primary.csv")
df_primary <- read_csv("data/primary.csv")
Rows: 16758 Columns: 5── Column specification ──────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): country, iso2c, iso3c
dbl (2): year, primary
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

データの確認

df_primary
str(df_primary)
spc_tbl_ [16,758 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ country: chr [1:16758] "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" ...
 $ iso2c  : chr [1:16758] "ZH" "ZH" "ZH" "ZH" ...
 $ iso3c  : chr [1:16758] "AFE" "AFE" "AFE" "AFE" ...
 $ year   : num [1:16758] 2022 2021 2020 2019 2018 ...
 $ primary: num [1:16758] 105 105 106 105 104 ...
 - attr(*, "spec")=
  .. cols(
  ..   country = col_character(),
  ..   iso2c = col_character(),
  ..   iso3c = col_character(),
  ..   year = col_double(),
  ..   primary = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 
REGION <- c("1A", "1W", "4E", "7E", "8S", "B8", "EU", "F1", "OE", "S1", 
"S2", "S3", "S4", "T2", "T3", "T4", "T5", "T6", "T7", "V1", "V2", 
"V3", "V4", "XC", "XD", "XE", "XF", "XG", "XH", "XI", "XJ", "XL", 
"XM", "XN", "XO", "XP", "XQ", "XT", "XU", "XY", "Z4", "Z7", "ZF", 
"ZG", "ZH", "ZI", "ZJ", "ZQ", "ZT")
df_primary |> filter(iso2c %in% REGION) |> distinct(country, iso2c)

分析する国のリスト

南部アフリカ関税同盟 The Southern African Customs Union (SACU)

SOUTH_AFRICA_FIVE <- c("South Africa", "Namibia", "Eswatini", "Botswana", "Lesotho")

ラテンアメリカでジニ指数が大きい4カ国

CHOSEN_COUNTRIES <- c("Suriname", "Belize", "Brazil", "Colombia")

分析

1. 各年毎のデータの数の棒グラフ

df_primary |> drop_na(primary) |> filter(!(iso2c %in% REGION)) |>
  ggplot(aes(year)) + geom_bar()

視覚化

2. 日本の初等学校就学率

df_primary |> filter(country == "Japan") |> 
  drop_na(primary) |> arrange(desc(year))

3. 経年変化

a. 日本

df_primary |> filter(country == "Japan") |> drop_na(primary) |>
  ggplot(aes(year, primary)) + geom_line()

気づいたこと・疑問

  • 1970年代の急激な上昇・下降、1980年ごろから上昇、そこで、100 を超えている。1995年ごろからは、減少しているが、まだ、100以上である。何が原因なのだろう。

b. 南部アフリカ関税同盟

df_primary |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(primary) |>
  ggplot(aes(year, primary)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_primary |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(primary) |>
  ggplot(aes(year, primary)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

気づいたこと・疑問

  • 100を超えている。

c. ラテンアメリカ4カ国

df_primary |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(primary) |>
  ggplot(aes(year, primary)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_primary |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(primary) |>
  ggplot(aes(year, primary)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

分布

データの数から、まずは、2020年について見てみる。

df_primary |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(primary) |>
  ggplot(aes(primary)) + geom_histogram(binwidth = 5)

参考:SACU の5カ国の値を縦線で書き込むには下のようにします。

df_primary |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) 

参考:日本とSACU の5カ国の値を縦線で書き込むには下のようにします。

JP <- 102.73683
SAF <- df_primary |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) |> pull(primary)
df_primary |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(primary) |>
  ggplot() + geom_histogram(aes(primary), binwidth = 5) +
  geom_vline(xintercept = SAF, col = "red") + geom_vline(xintercept = JP, col = "blue") +labs(title = "2020年の初等学校就学率", subtitle = "日本:青、SACU:赤")

データが十分ある最近の年の値の10カ国の値の棒グラフ

a. 値が大きい方から

df_primary |> filter(year == 2020) |> drop_na(primary) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(desc(primary)) |> head(10) |> 
  ggplot(aes(fct_reorder(country, primary), primary)) + geom_col() + 
  coord_flip() + labs(title = "Top 10 Countries", x = "country", y = "初等学校就学率")

b. 値が小さい方から

df_primary |> filter(year == 2020) |> drop_na(primary) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(primary) |> head(10) |> 
  ggplot(aes(fct_rev(fct_reorder(country, primary)), primary)) + geom_col() + 
  coord_flip() + labs(title = "Lowest 10 Countries", x = "country", y = "初等学校就学率")

3. 中等学校就学率

データ

  • School enrollment, secondary (% gross):SE.SEC.ENRR [Link]

データ情報

  • データ名:

  • データコード:

  • 変数名:

  • 概要:

データの取得

準備

library(tidyverse)
library(WDI)

WDI パッケージを使って、直接データをダウンロードし、変数名を、ed_exp に指定。

df_secondary <- WDI(indicator = c(secondary = "SE.SEC.ENRR"))
write_csv(df_secondary, "data/secondary.csv")
df_secondary <- read_csv("data/secondary.csv")
Rows: 16758 Columns: 5── Column specification ──────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): country, iso2c, iso3c
dbl (2): year, secondary
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

データの確認

df_secondary
str(df_secondary)
spc_tbl_ [16,758 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ country  : chr [1:16758] "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" ...
 $ iso2c    : chr [1:16758] "ZH" "ZH" "ZH" "ZH" ...
 $ iso3c    : chr [1:16758] "AFE" "AFE" "AFE" "AFE" ...
 $ year     : num [1:16758] 2022 2021 2020 2019 2018 ...
 $ secondary: num [1:16758] NA NA 43.8 43.4 43.2 ...
 - attr(*, "spec")=
  .. cols(
  ..   country = col_character(),
  ..   iso2c = col_character(),
  ..   iso3c = col_character(),
  ..   year = col_double(),
  ..   secondary = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 
REGION <- c("1A", "1W", "4E", "7E", "8S", "B8", "EU", "F1", "OE", "S1", 
"S2", "S3", "S4", "T2", "T3", "T4", "T5", "T6", "T7", "V1", "V2", 
"V3", "V4", "XC", "XD", "XE", "XF", "XG", "XH", "XI", "XJ", "XL", 
"XM", "XN", "XO", "XP", "XQ", "XT", "XU", "XY", "Z4", "Z7", "ZF", 
"ZG", "ZH", "ZI", "ZJ", "ZQ", "ZT")
df_secondary |> filter(iso2c %in% REGION) |> distinct(country, iso2c)
df_secondary |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c)

分析する国のリスト

南部アフリカ関税同盟 The Southern African Customs Union (SACU)

SOUTH_AFRICA_FIVE <- c("South Africa", "Namibia", "Eswatini", "Botswana", "Lesotho")

ラテンアメリカでジニ指数が大きい4カ国

CHOSEN_COUNTRIES <- c("Suriname", "Belize", "Brazil", "Colombia")

分析

1. 各年毎のデータの数の棒グラフ

df_secondary |> drop_na(secondary) |> filter(!(iso2c %in% REGION)) |>
  ggplot(aes(year)) + geom_bar()

視覚化

2. 日本の中等学校就学率

df_secondary |> filter(country == "Japan") |> 
  drop_na(secondary) |> arrange(desc(year))

3. 経年変化

a. 日本

df_secondary |> filter(country == "Japan") |> drop_na(secondary) |>
  ggplot(aes(year, secondary)) + geom_line()

気づいたこと・疑問

  • 2000年ごろから減少、その後も変化がある。何が原因なのだろう。

b. 南部アフリカ関税同盟

df_secondary |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(secondary) |>
  ggplot(aes(year, secondary)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_secondary |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(secondary) |>
  ggplot(aes(year, secondary)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

気づいたこと・疑問

  • 平均で見ると、一定して上昇している。

c. ラテンアメリカ4カ国

df_secondary |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(secondary) |>
  ggplot(aes(year, secondary)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_secondary |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(secondary) |>
  ggplot(aes(year, secondary)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

分布

データの数から、まずは、2020年について見てみる。

df_secondary |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(secondary) |>
  ggplot(aes(secondary)) + geom_histogram(binwidth = 10)

参考:SACU の5カ国の値を縦線で書き込むには下のようにします。

df_secondary |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) 

参考:日本とSACU の5カ国の値を縦線で書き込むには下のようにします。

JP <- 102.84480
SAF <- df_secondary |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) |> pull(secondary)
df_secondary |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(secondary) |>
  ggplot() + geom_histogram(aes(secondary), binwidth = 10) +
  geom_vline(xintercept = SAF, col = "red") + geom_vline(xintercept = JP, col = "blue") +labs(title = "2020年の中等学校就学率", subtitle = "日本:青、SACU:赤")

データが十分ある最近の年の値の10カ国の値の棒グラフ

a. 値が大きい方から

df_secondary |> filter(year == 2020) |> drop_na(secondary) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(desc(secondary)) |> head(10) |> 
  ggplot(aes(fct_reorder(country, secondary), secondary)) + geom_col() + 
  coord_flip() + labs(title = "Top 10 Countries", x = "country", y = "secondary school enrollment")

b. 値が小さい方から

df_secondary |> filter(year == 2020) |> drop_na(secondary) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(secondary) |> head(10) |> 
  ggplot(aes(fct_rev(fct_reorder(country, secondary)), secondary)) + geom_col() + 
  coord_flip() + labs(title = "Lowest 10 Countries", x = "country", y = "secondary schooll enrollment")

4. 中等学校後の就学率

データ

  • School enrollment, tertiary (% gross):SE.TER.ENRR [Link]

データ情報

  • データ名:

  • データコード:

  • 変数名:

  • 概要:

データの取得

準備

library(tidyverse)
library(WDI)

WDI パッケージを使って、直接データをダウンロードし、変数名を、ed_exp に指定。

df_tertiary <- WDI(indicator = c(tertiary = "SE.TER.ENRR"))
write_csv(df_tertiary, "data/tertiary.csv")
df_tertiary <- read_csv("data/tertiary.csv")
Rows: 16758 Columns: 5── Column specification ──────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): country, iso2c, iso3c
dbl (2): year, tertiary
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

データの確認

df_tertiary
str(df_tertiary)
spc_tbl_ [16,758 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ country : chr [1:16758] "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" ...
 $ iso2c   : chr [1:16758] "ZH" "ZH" "ZH" "ZH" ...
 $ iso3c   : chr [1:16758] "AFE" "AFE" "AFE" "AFE" ...
 $ year    : num [1:16758] 2022 2021 2020 2019 2018 ...
 $ tertiary: num [1:16758] NA 8.85 9.23 8.81 8.9 ...
 - attr(*, "spec")=
  .. cols(
  ..   country = col_character(),
  ..   iso2c = col_character(),
  ..   iso3c = col_character(),
  ..   year = col_double(),
  ..   tertiary = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 
REGION <- c("1A", "1W", "4E", "7E", "8S", "B8", "EU", "F1", "OE", "S1", 
"S2", "S3", "S4", "T2", "T3", "T4", "T5", "T6", "T7", "V1", "V2", 
"V3", "V4", "XC", "XD", "XE", "XF", "XG", "XH", "XI", "XJ", "XL", 
"XM", "XN", "XO", "XP", "XQ", "XT", "XU", "XY", "Z4", "Z7", "ZF", 
"ZG", "ZH", "ZI", "ZJ", "ZQ", "ZT")
df_tertiary |> filter(iso2c %in% REGION) |> distinct(country, iso2c)
df_tertiary |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c)

分析する国のリスト

南部アフリカ関税同盟 The Southern African Customs Union (SACU)

SOUTH_AFRICA_FIVE <- c("South Africa", "Namibia", "Eswatini", "Botswana", "Lesotho")

ラテンアメリカでジニ指数が大きい4カ国

CHOSEN_COUNTRIES <- c("Suriname", "Belize", "Brazil", "Colombia")

分析

1. 各年毎のデータの数の棒グラフ

df_tertiary |> drop_na(tertiary) |> filter(!(iso2c %in% REGION)) |>
  ggplot(aes(year)) + geom_bar()

視覚化

2. 日本の教育費(% of GDP)

df_tertiary |> filter(country == "Japan") |> 
  drop_na(tertiary) |> arrange(desc(year))

3. 経年変化

a. 日本

df_tertiary |> filter(country == "Japan") |> drop_na(tertiary) |>
  ggplot(aes(year, tertiary)) + geom_line()

気づいたこと・疑問

  • 1970年代の急激な上昇、1990年ごろからまた増加は、何が原因なのだろう。

  • どのように、中等学校後について定めているのだろう。

b. 南部アフリカ関税同盟

df_tertiary |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(tertiary) |>
  ggplot(aes(year, tertiary)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_tertiary |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(tertiary) |>
  ggplot(aes(year, tertiary)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

気づいたこと・疑問

  • 平均で見ると、上昇してきており、7% 程度という大きな割合になっている。

c. ラテンアメリカ4カ国

df_tertiary |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(tertiary) |>
  ggplot(aes(year, tertiary)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_tertiary |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(tertiary) |>
  ggplot(aes(year, tertiary)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

分布

データの数から、まずは、2020年について見てみる。

df_tertiary |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(tertiary) |>
  ggplot(aes(tertiary)) + geom_histogram(binwidth = 10)

参考:SACU の5カ国の値を縦線で書き込むには下のようにします。

df_tertiary |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) 

参考:日本とSACU の5カ国の値を縦線で書き込むには下のようにします。

JP <- 62.13584
SAF <- df_tertiary |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) |> pull(tertiary)
df_tertiary |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(tertiary) |>
  ggplot() + geom_histogram(aes(tertiary), binwidth = 10) +
  geom_vline(xintercept = SAF, col = "red") + geom_vline(xintercept = JP, col = "blue") +labs(title = "2020年の中等学校後の就学率", subtitle = "日本:青、SACU:赤")

データが十分ある最近の年の値の10カ国の値の棒グラフ

a. 値が大きい方から

df_tertiary |> filter(year == 2020) |> drop_na(tertiary) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(desc(tertiary)) |> head(10) |> 
  ggplot(aes(fct_reorder(country, tertiary), tertiary)) + geom_col() + 
  coord_flip() + labs(title = "Top 10 Countries", x = "country", y = "tertiary school enrollment")

b. 値が小さい方から

df_tertiary |> filter(year == 2020) |> drop_na(tertiary) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(tertiary) |> head(10) |> 
  ggplot(aes(fct_rev(fct_reorder(country, tertiary)), tertiary)) + geom_col() + 
  coord_flip() + labs(title = "Lowest 10 Countries", x = "country", y = "tertiary school enrollment")

5. 五歳未満の死亡率

データ

  • Mortality rate, under-5 (per 1,000 live births):SH.DYN.MORT [Link]

データ情報

  • データ名:

  • データコード:

  • 変数名:

  • 概要:

データの取得

準備

library(tidyverse)
library(WDI)

WDI パッケージを使って、直接データをダウンロードし、変数名を、ed_exp に指定。

df_under5 <- WDI(indicator = c(under5 = "SH.DYN.MORT"))
write_csv(df_under5, "data/under5.csv")
df_under5 <- read_csv("data/under5.csv")
Rows: 16758 Columns: 5── Column specification ──────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): country, iso2c, iso3c
dbl (2): year, under5
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

データの確認

df_under5
str(df_under5)
spc_tbl_ [16,758 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ country: chr [1:16758] "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" ...
 $ iso2c  : chr [1:16758] "ZH" "ZH" "ZH" "ZH" ...
 $ iso3c  : chr [1:16758] "AFE" "AFE" "AFE" "AFE" ...
 $ year   : num [1:16758] 2022 2021 2020 2019 2018 ...
 $ under5 : num [1:16758] NA 57.3 59.1 60.9 62.9 ...
 - attr(*, "spec")=
  .. cols(
  ..   country = col_character(),
  ..   iso2c = col_character(),
  ..   iso3c = col_character(),
  ..   year = col_double(),
  ..   under5 = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 
REGION <- c("1A", "1W", "4E", "7E", "8S", "B8", "EU", "F1", "OE", "S1", 
"S2", "S3", "S4", "T2", "T3", "T4", "T5", "T6", "T7", "V1", "V2", 
"V3", "V4", "XC", "XD", "XE", "XF", "XG", "XH", "XI", "XJ", "XL", 
"XM", "XN", "XO", "XP", "XQ", "XT", "XU", "XY", "Z4", "Z7", "ZF", 
"ZG", "ZH", "ZI", "ZJ", "ZQ", "ZT")
df_under5 |> filter(iso2c %in% REGION) |> distinct(country, iso2c)
df_under5 |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c)

分析する国のリスト

南部アフリカ関税同盟 The Southern African Customs Union (SACU)

SOUTH_AFRICA_FIVE <- c("South Africa", "Namibia", "Eswatini", "Botswana", "Lesotho")

ラテンアメリカでジニ指数が大きい4カ国

CHOSEN_COUNTRIES <- c("Suriname", "Belize", "Brazil", "Colombia")

分析

1. 各年毎のデータの数の棒グラフ

df_under5 |> drop_na(under5) |> filter(!(iso2c %in% REGION)) |>
  ggplot(aes(year)) + geom_bar()

視覚化

2. 五歳未満死亡率(1000人あたり)

df_under5 |> filter(country == "Japan") |> 
  drop_na(under5) |> arrange(desc(year))

3. 経年変化

a. 日本

df_under5 |> filter(country == "Japan") |> drop_na(under5) |>
  ggplot(aes(year, under5)) + geom_line()

気づいたこと・疑問

  • 継続的に減少している。

  • 1960年ごろは40% ということは、1950年ごろは、50% ぐらいだったのだろうか。

b. 南部アフリカ関税同盟

df_under5 |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(under5) |>
  ggplot(aes(year, under5)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_under5 |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(under5) |>
  ggplot(aes(year, under5)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

気づいたこと・疑問

  • 2000年すぎに上昇しているが、それ以外は、減少している。
  • 紛争だろうか。

c. ラテンアメリカ4カ国

df_under5 |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(under5) |>
  ggplot(aes(year, under5)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_under5 |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(under5) |>
  ggplot(aes(year, under5)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

分布

データの数から、まずは、2020年について見てみる。

df_under5 |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(under5) |>
  ggplot(aes(under5)) + geom_histogram(binwidth = 10)

参考:SACU の5カ国の値を縦線で書き込むには下のようにします。

df_under5 |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) 

参考:日本とSACU の5カ国の値を縦線で書き込むには下のようにします。

JP <- 2.4
SAF <- df_under5 |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) |> pull(under5)
df_under5 |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(under5) |>
  ggplot() + geom_histogram(aes(under5), binwidth = 10) +
  geom_vline(xintercept = SAF, col = "red") + geom_vline(xintercept = JP, col = "blue") +labs(title = "五歳未満の死亡率(1000人あたり)", subtitle = "日本:青、SACU:赤")

データが十分ある最近の年の値の10カ国の値の棒グラフ

a. 値が大きい方から

df_under5 |> filter(year == 2020) |> drop_na(under5) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(desc(under5)) |> head(10) |> 
  ggplot(aes(fct_reorder(country, under5), under5)) + geom_col() + 
  coord_flip() + labs(title = "五歳未満の死亡率(1000人あたり)", x = "country")

b. 値が小さい方から

df_under5 |> filter(year == 2020) |> drop_na(under5) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(under5) |> head(10) |> 
  ggplot(aes(fct_rev(fct_reorder(country, under5)), under5)) + geom_col() + 
  coord_flip() + labs(title = "Lowest 10 Countries", y = "under 5 mortality", x = "country")

6. 初等中等学校就学率(性差)

データ

  • School enrollment, primary and secondary (gross), gender parity index (GPI):SE.ENR.PRSC.FM.ZS [Link]

データ情報

  • データ名:

  • データコード:

  • 変数名:

  • 概要:

データの取得

準備

library(tidyverse)
library(WDI)

WDI パッケージを使って、直接データをダウンロードし、変数名を、ed_exp に指定。

df_school_gpi <- WDI(indicator = c(school_gpi = "SE.ENR.PRSC.FM.ZS"))
write_csv(df_school_gpi, "data/school_gpi.csv")
df_school_gpi <- read_csv("data/school_gpi.csv")
Rows: 16758 Columns: 5── Column specification ──────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): country, iso2c, iso3c
dbl (2): year, school_gpi
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

データの確認

df_school_gpi
str(df_school_gpi)
spc_tbl_ [16,758 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ country   : chr [1:16758] "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" ...
 $ iso2c     : chr [1:16758] "ZH" "ZH" "ZH" "ZH" ...
 $ iso3c     : chr [1:16758] "AFE" "AFE" "AFE" "AFE" ...
 $ year      : num [1:16758] 2022 2021 2020 2019 2018 ...
 $ school_gpi: num [1:16758] NA NA 0.944 0.941 0.94 ...
 - attr(*, "spec")=
  .. cols(
  ..   country = col_character(),
  ..   iso2c = col_character(),
  ..   iso3c = col_character(),
  ..   year = col_double(),
  ..   school_gpi = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 
REGION <- c("1A", "1W", "4E", "7E", "8S", "B8", "EU", "F1", "OE", "S1", 
"S2", "S3", "S4", "T2", "T3", "T4", "T5", "T6", "T7", "V1", "V2", 
"V3", "V4", "XC", "XD", "XE", "XF", "XG", "XH", "XI", "XJ", "XL", 
"XM", "XN", "XO", "XP", "XQ", "XT", "XU", "XY", "Z4", "Z7", "ZF", 
"ZG", "ZH", "ZI", "ZJ", "ZQ", "ZT")
df_school_gpi |> filter(iso2c %in% REGION) |> distinct(country, iso2c)
df_school_gpi |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c)

分析する国のリスト

南部アフリカ関税同盟 The Southern African Customs Union (SACU)

SOUTH_AFRICA_FIVE <- c("South Africa", "Namibia", "Eswatini", "Botswana", "Lesotho")

ラテンアメリカでジニ指数が大きい4カ国

CHOSEN_COUNTRIES <- c("Suriname", "Belize", "Brazil", "Colombia")

分析

1. 各年毎のデータの数の棒グラフ

df_school_gpi |> drop_na(school_gpi) |> filter(!(iso2c %in% REGION)) |>
  ggplot(aes(year)) + geom_bar()

視覚化

2. 日本の初等中等学校就学率における GPI

df_school_gpi |> filter(country == "Japan") |> 
  drop_na(school_gpi) |> arrange(desc(year))

3. 経年変化

a. 日本

df_school_gpi |> filter(country == "Japan") |> drop_na(school_gpi) |>
  ggplot(aes(year, school_gpi)) + geom_line()

気づいたこと・疑問

  • 1995年ごろまでは揺らぎがある。そのあとは、下降。

  • 差が小さいので、あまり、気にするのは適切ではないかもしれない。

b. 南部アフリカ関税同盟

df_school_gpi |> filter(country %in% SOUTH_AFRICA_FIVE) |> 
  drop_na(school_gpi) |>
  ggplot(aes(year, school_gpi)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_school_gpi |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(school_gpi) |>
  ggplot(aes(year, school_gpi)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

気づいたこと・疑問

  • ゆるやかに減少。1.0 に近づいている。

c. ラテンアメリカ4カ国

df_school_gpi |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(school_gpi) |>
  ggplot(aes(year, school_gpi)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_school_gpi |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(school_gpi) |>
  ggplot(aes(year, school_gpi)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

分布

データの数から、2020年のデータは少ないので、2019年について見てみる。

df_school_gpi |> filter(year == 2019) |> filter(!(country %in% REGION))|>
  drop_na(school_gpi) |>
  ggplot(aes(school_gpi)) + geom_histogram(binwidth = 0.02)

参考:SACU の5カ国の値を縦線で書き込むには下のようにします。

df_school_gpi |> filter(year == 2019) |> filter(country %in% SOUTH_AFRICA_FIVE) 

参考:日本とSACU の5カ国の値を縦線で書き込むには下のようにします。

JP <- 1.00341 # no recent data after 2019
SAF <- df_school_gpi |> filter(year == 2019) |> filter(country %in% SOUTH_AFRICA_FIVE) |> pull(school_gpi)
df_school_gpi |> filter(year == 2019) |> filter(!(country %in% REGION))|>
  drop_na(school_gpi) |>
  ggplot() + geom_histogram(aes(school_gpi), binwidth = 0.02) +
  geom_vline(xintercept = SAF, col = "red") + geom_vline(xintercept = JP, col = "blue") +labs(title = "2019年の初等中等学校就学率 GPI", subtitle = "日本:青、SACU:赤")

データが十分ある最近の年の値の10カ国の値の棒グラフ

a. 値が大きい方から

df_school_gpi |> filter(year == 2019) |> drop_na(school_gpi) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(desc(school_gpi)) |> head(10) |> 
  ggplot(aes(fct_reorder(country, school_gpi), school_gpi)) + geom_col() + 
  coord_flip() + labs(title = "Top 10 Countries", x = "country", y = "primary and secondary enrollment, GPI")

b. 値が小さい方から

df_school_gpi |> filter(year == 2019) |> drop_na(school_gpi) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(school_gpi) |> head(10) |> 
  ggplot(aes(fct_rev(fct_reorder(country, school_gpi)), school_gpi)) + geom_col() + 
  coord_flip() + labs(title = "Lowest 10 Countries", x = "country", y = "primary and secondary enrollment, GPI")

7. 女性就労率

データ

  • Ratio of female to male labor force participation rate (%) (modeled ILO estimate):SL.TLF.CACT.FM.ZS [Link]

データ情報

  • データ名:

  • データコード:

  • 変数名:

  • 概要:データの取得

準備

library(tidyverse)
library(WDI)

WDI パッケージを使って、直接データをダウンロードし、変数名を、ed_exp に指定。

df_job_gpi <- WDI(indicator = c(job_gpi = "SL.TLF.CACT.FM.ZS"))
write_csv(df_job_gpi, "data/job_gpi.csv")
df_job_gpi <- read_csv("data/job_gpi.csv")
Rows: 16758 Columns: 5── Column specification ──────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): country, iso2c, iso3c
dbl (2): year, job_gpi
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

データの確認

df_job_gpi
str(df_job_gpi)
spc_tbl_ [16,758 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ country: chr [1:16758] "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" ...
 $ iso2c  : chr [1:16758] "ZH" "ZH" "ZH" "ZH" ...
 $ iso3c  : chr [1:16758] "AFE" "AFE" "AFE" "AFE" ...
 $ year   : num [1:16758] 2022 2021 2020 2019 2018 ...
 $ job_gpi: num [1:16758] 87.5 87.2 86.7 86.9 86.6 ...
 - attr(*, "spec")=
  .. cols(
  ..   country = col_character(),
  ..   iso2c = col_character(),
  ..   iso3c = col_character(),
  ..   year = col_double(),
  ..   job_gpi = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 
REGION <- c("1A", "1W", "4E", "7E", "8S", "B8", "EU", "F1", "OE", "S1", 
"S2", "S3", "S4", "T2", "T3", "T4", "T5", "T6", "T7", "V1", "V2", 
"V3", "V4", "XC", "XD", "XE", "XF", "XG", "XH", "XI", "XJ", "XL", 
"XM", "XN", "XO", "XP", "XQ", "XT", "XU", "XY", "Z4", "Z7", "ZF", 
"ZG", "ZH", "ZI", "ZJ", "ZQ", "ZT")
df_job_gpi |> filter(iso2c %in% REGION) |> distinct(country, iso2c)
df_job_gpi |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c)

分析する国のリスト

南部アフリカ関税同盟 The Southern African Customs Union (SACU)

SOUTH_AFRICA_FIVE <- c("South Africa", "Namibia", "Eswatini", "Botswana", "Lesotho")

ラテンアメリカでジニ指数が大きい4カ国

CHOSEN_COUNTRIES <- c("Suriname", "Belize", "Brazil", "Colombia")

分析

1. 各年毎のデータの数の棒グラフ

df_job_gpi |> drop_na(job_gpi) |> filter(!(iso2c %in% REGION)) |>
  ggplot(aes(year)) + geom_bar()

視覚化

2. 日本の女性就労率

df_job_gpi |> filter(country == "Japan") |> 
  drop_na(job_gpi) |> arrange(desc(year))

3. 経年変化

a. 日本

df_job_gpi |> filter(country == "Japan") |> drop_na(job_gpi) |>
  ggplot(aes(year, job_gpi)) + geom_line()

気づいたこと・疑問

  • 2000年ごろからは上昇している。どんな政策変更があったのだろうか。

  • このまま、上昇すると、2040年ごろには、90を超え、100に近づく。それで、問題は解決したと言えるのだろうか。

b. 南部アフリカ関税同盟

df_job_gpi |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(job_gpi) |>
  ggplot(aes(year, job_gpi)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_job_gpi |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(job_gpi) |>
  ggplot(aes(year, job_gpi)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

気づいたこと・疑問

  • 全体的には上昇している。

c. ラテンアメリカ4カ国

df_job_gpi |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(job_gpi) |>
  ggplot(aes(year, job_gpi)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_job_gpi |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(job_gpi) |>
  ggplot(aes(year, job_gpi)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

分布

データの数から、まずは、2020年について見てみる。

df_job_gpi |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(job_gpi) |>
  ggplot(aes(job_gpi)) + geom_histogram(binwidth = 10)

参考:SACU の5カ国の値を縦線で書き込むには下のようにします。

df_job_gpi |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) 

参考:日本とSACU の5カ国の値を縦線で書き込むには下のようにします。

JP <- 74.51027
SAF <- df_job_gpi |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) |> pull(job_gpi)
df_job_gpi |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(job_gpi) |>
  ggplot() + geom_histogram(aes(job_gpi), binwidth = 10) +
  geom_vline(xintercept = SAF, col = "red") + geom_vline(xintercept = JP, col = "blue") +labs(title = "女性の就労率", subtitle = "日本:青、SACU:赤")

データが十分ある最近の年の値の10カ国の値の棒グラフ

a. 値が大きい方から

df_job_gpi |> filter(year == 2020) |> drop_na(job_gpi) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(desc(job_gpi)) |> head(10) |> 
  ggplot(aes(fct_reorder(country, job_gpi), job_gpi)) + geom_col() + 
  coord_flip() + labs(title = "Top 10 Countries", x = "country", y = "labor force participation rate of ")

b. 値が小さい方から

df_job_gpi |> filter(year == 2020) |> drop_na(job_gpi) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(job_gpi) |> head(10) |> 
  ggplot(aes(fct_rev(fct_reorder(country, job_gpi)), job_gpi)) + geom_col() + 
  coord_flip() + labs(title = "Lowest 10 Countries", x = "country", y = "labor force participation rate")

8. 女性失業率

データ

  • Unemployment, female (% of female labor force) (modeled ILO estimate):SL.UEM.TOTL.FE.ZS [Link]

データ情報

  • データ名:

  • データコード:

  • 変数名:

  • 概要:

データの取得

準備

library(tidyverse)
library(WDI)

WDI パッケージを使って、直接データをダウンロードし、変数名を、ed_exp に指定。

df_female_unemploy <- WDI(indicator = c(female_unemploy = "SL.UEM.TOTL.FE.ZS"))
write_csv(df_female_unemploy, "data/female_unemploy.csv")
df_female_unemploy <- read_csv("data/female_unemploy.csv")
Rows: 16758 Columns: 5── Column specification ──────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): country, iso2c, iso3c
dbl (2): year, female_unemploy
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

データの確認

df_female_unemploy
str(df_female_unemploy)
spc_tbl_ [16,758 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ country        : chr [1:16758] "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" ...
 $ iso2c          : chr [1:16758] "ZH" "ZH" "ZH" "ZH" ...
 $ iso3c          : chr [1:16758] "AFE" "AFE" "AFE" "AFE" ...
 $ year           : num [1:16758] 2022 2021 2020 2019 2018 ...
 $ female_unemploy: num [1:16758] 8.51 8.5 8.12 7.62 7.42 ...
 - attr(*, "spec")=
  .. cols(
  ..   country = col_character(),
  ..   iso2c = col_character(),
  ..   iso3c = col_character(),
  ..   year = col_double(),
  ..   female_unemploy = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 
REGION <- c("1A", "1W", "4E", "7E", "8S", "B8", "EU", "F1", "OE", "S1", 
"S2", "S3", "S4", "T2", "T3", "T4", "T5", "T6", "T7", "V1", "V2", 
"V3", "V4", "XC", "XD", "XE", "XF", "XG", "XH", "XI", "XJ", "XL", 
"XM", "XN", "XO", "XP", "XQ", "XT", "XU", "XY", "Z4", "Z7", "ZF", 
"ZG", "ZH", "ZI", "ZJ", "ZQ", "ZT")
df_female_unemploy |> filter(iso2c %in% REGION) |> distinct(country, iso2c)
df_female_unemploy |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c)

分析する国のリスト

南部アフリカ関税同盟 The Southern African Customs Union (SACU)

SOUTH_AFRICA_FIVE <- c("South Africa", "Namibia", "Eswatini", "Botswana", "Lesotho")

ラテンアメリカでジニ指数が大きい4カ国

CHOSEN_COUNTRIES <- c("Suriname", "Belize", "Brazil", "Colombia")

分析

1. 各年毎のデータの数の棒グラフ

df_female_unemploy |> drop_na(female_unemploy) |> filter(!(iso2c %in% REGION)) |>
  ggplot(aes(year)) + geom_bar()

視覚化

2. 日本の女性失業率

df_female_unemploy |> filter(country == "Japan") |> 
  drop_na(female_unemploy) |> arrange(desc(year))

3. 経年変化

a. 日本

df_female_unemploy |> filter(country == "Japan") |> drop_na(female_unemploy) |>
  ggplot(aes(year, female_unemploy)) + geom_line()

気づいたこと・疑問

  • 2000年ごろから、2010年ごろまで非常に高い水準になっている。何が原因なのだろう。

b. 南部アフリカ関税同盟

df_female_unemploy |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(female_unemploy) |>
  ggplot(aes(year, female_unemploy)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_female_unemploy |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(female_unemploy) |>
  ggplot(aes(year, female_unemploy)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

気づいたこと・疑問

  • 平均で見ると、23%程度。

c. ラテンアメリカ4カ国

df_female_unemploy |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(female_unemploy) |>
  ggplot(aes(year, female_unemploy)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_female_unemploy |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(female_unemploy) |>
  ggplot(aes(year, female_unemploy)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

分布

データの数から、まずは、2020年について見てみる。

df_female_unemploy |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(female_unemploy) |>
  ggplot(aes(female_unemploy)) + geom_histogram(binwidth = 2)

参考:SACU の5カ国の値を縦線で書き込むには下のようにします。

df_female_unemploy |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) 

参考:日本とSACU の5カ国の値を縦線で書き込むには下のようにします。

JP <- 2.520
SAF <- df_female_unemploy |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) |> pull(female_unemploy)
df_female_unemploy |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(female_unemploy) |>
  ggplot() + geom_histogram(aes(female_unemploy), binwidth = 2) +
  geom_vline(xintercept = SAF, col = "red") + geom_vline(xintercept = JP, col = "blue") +labs(title = "2020年の女性の求職率", subtitle = "日本:青、SACU:赤")

データが十分ある最近の年の値の10カ国の値の棒グラフ

a. 値が大きい方から

df_female_unemploy |> filter(year == 2020) |> drop_na(female_unemploy) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(desc(female_unemploy)) |> head(10) |> 
  ggplot(aes(fct_reorder(country, female_unemploy), female_unemploy)) + geom_col() + 
  coord_flip() + labs(title = "Top 10 Countries", x = "country", y = "unemployment rate, female, 2020")

b. 値が小さい方から

df_female_unemploy |> filter(year == 2020) |> drop_na(female_unemploy) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(female_unemploy) |> head(10) |> 
  ggplot(aes(fct_rev(fct_reorder(country, female_unemploy)), female_unemploy)) + geom_col() + 
  coord_flip() + labs(title = "Lowest 10 Countries", x = "country", y = "unemployment rate, female, 2020")

男性失業率

データ

  • Unemployment, male (% of male labor force) (modeled ILO estimate):SL.UEM.TOTL.MA.ZS [Link]

データ情報

  • データ名:

  • データコード:SL.UEM.TOTL.MA.ZS

  • 変数名:male_unemploy

  • 概要:

データの取得

準備

library(tidyverse)
library(WDI)

WDI パッケージを使って、直接データをダウンロードし、変数名を、ed_exp に指定。

df_male_unemploy <- WDI(indicator = c(male_unemploy = "SL.UEM.TOTL.MA.ZS"))
write_csv(df_male_unemploy, "data/male_unemploy.csv")
df_male_unemploy <- read_csv("data/male_unemploy.csv")
Rows: 16758 Columns: 5── Column specification ──────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): country, iso2c, iso3c
dbl (2): year, male_unemploy
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

データの確認

df_male_unemploy
str(df_male_unemploy)
spc_tbl_ [16,758 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ country      : chr [1:16758] "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" ...
 $ iso2c        : chr [1:16758] "ZH" "ZH" "ZH" "ZH" ...
 $ iso3c        : chr [1:16758] "AFE" "AFE" "AFE" "AFE" ...
 $ year         : num [1:16758] 2022 2021 2020 2019 2018 ...
 $ male_unemploy: num [1:16758] 7.38 7.4 7.19 6.67 6.46 ...
 - attr(*, "spec")=
  .. cols(
  ..   country = col_character(),
  ..   iso2c = col_character(),
  ..   iso3c = col_character(),
  ..   year = col_double(),
  ..   male_unemploy = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 
REGION <- c("1A", "1W", "4E", "7E", "8S", "B8", "EU", "F1", "OE", "S1", 
"S2", "S3", "S4", "T2", "T3", "T4", "T5", "T6", "T7", "V1", "V2", 
"V3", "V4", "XC", "XD", "XE", "XF", "XG", "XH", "XI", "XJ", "XL", 
"XM", "XN", "XO", "XP", "XQ", "XT", "XU", "XY", "Z4", "Z7", "ZF", 
"ZG", "ZH", "ZI", "ZJ", "ZQ", "ZT")
df_male_unemploy |> filter(iso2c %in% REGION) |> distinct(country, iso2c)
df_male_unemploy |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c)

分析する国のリスト

南部アフリカ関税同盟 The Southern African Customs Union (SACU)

SOUTH_AFRICA_FIVE <- c("South Africa", "Namibia", "Eswatini", "Botswana", "Lesotho")

ラテンアメリカでジニ指数が大きい4カ国

CHOSEN_COUNTRIES <- c("Suriname", "Belize", "Brazil", "Colombia")

分析

1. 各年毎のデータの数の棒グラフ

df_male_unemploy |> drop_na(male_unemploy) |> filter(!(iso2c %in% REGION)) |>
  ggplot(aes(year)) + geom_bar()

視覚化

2. 日本の男性失業率

df_male_unemploy |> filter(country == "Japan") |> 
  drop_na(male_unemploy) |> arrange(desc(year))

3. 経年変化

a. 日本

df_male_unemploy |> filter(country == "Japan") |> drop_na(male_unemploy) |>
  ggplot(aes(year, male_unemploy)) + geom_line()

気づいたこと・疑問

  • 2002年ごろと、

  • 2014年ごろから減少、2018年ごろから増加、2020年から2021年は減少。

b. 南部アフリカ関税同盟

df_ed_exp |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_ed_exp |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

気づいたこと・疑問

  • 平均で見ると、上昇してきており、7% 程度という大きな割合になっている。

c. ラテンアメリカ4カ国

df_ed_exp |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_ed_exp |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

分布

データの数から、まずは、2020年について見てみる。

df_ed_exp |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(ed_exp) |>
  ggplot(aes(ed_exp)) + geom_histogram(binwidth = 1)

参考:SACU の5カ国の値を縦線で書き込むには下のようにします。

df_ed_exp |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) 

参考:日本とSACU の5カ国の値を縦線で書き込むには下のようにします。

JP <- 3.416981
SAF <- df_ed_exp |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) |> pull(ed_exp)
df_ed_exp |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(ed_exp) |>
  ggplot() + geom_histogram(aes(ed_exp), binwidth = 1) +
  geom_vline(xintercept = SAF, col = "red") + geom_vline(xintercept = JP, col = "blue") +labs(title = "2020年の教育費の対GDP百分率", subtitle = "日本:青、SACU:赤")

データが十分ある最近の年の値の10カ国の値の棒グラフ

a. 値が大きい方から

df_ed_exp |> filter(year == 2020) |> drop_na(ed_exp) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(desc(ed_exp)) |> head(10) |> 
  ggplot(aes(fct_reorder(country, ed_exp), ed_exp)) + geom_col() + 
  coord_flip() + labs(title = "Top 10 Countries", x = "country", y = "Government expenditure on education, total (% of GDP)")

b. 値が小さい方から

df_ed_exp |> filter(year == 2020) |> drop_na(ed_exp) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(ed_exp) |> head(10) |> 
  ggplot(aes(fct_rev(fct_reorder(country, ed_exp)), ed_exp)) + geom_col() + 
  coord_flip() + labs(title = "Lowest 10 Countries", x = "country", y = "Government expenditure on education, total (% of GDP)")

10. 負債率

データ

  • Net official development assistance and official aid received (current US$) DT.ODA.ALLD.CD [Link]

データ情報

  • データ名:

  • データコード:

  • 変数名:

  • 概要:

データの取得

準備

library(tidyverse)
library(WDI)

WDI パッケージを使って、直接データをダウンロードし、変数名を、ed_exp に指定。

df_ed_exp <- WDI(indicator = c(ed_exp = "SE.XPD.TOTL.GD.ZS"))
write_csv(df_ed_exp, "data/ed_exp.csv")
df_ed_exp <- read_csv("data/ed_exp.csv")

データの確認

df_ed_exp
str(df_ed_exp)
REGION <- c("1A", "1W", "4E", "7E", "8S", "B8", "EU", "F1", "OE", "S1", 
"S2", "S3", "S4", "T2", "T3", "T4", "T5", "T6", "T7", "V1", "V2", 
"V3", "V4", "XC", "XD", "XE", "XF", "XG", "XH", "XI", "XJ", "XL", 
"XM", "XN", "XO", "XP", "XQ", "XT", "XU", "XY", "Z4", "Z7", "ZF", 
"ZG", "ZH", "ZI", "ZJ", "ZQ", "ZT")
df_ed_exp |> filter(iso2c %in% REGION) |> distinct(country, iso2c)
df_ed_exp |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c)

分析する国のリスト

南部アフリカ関税同盟 The Southern African Customs Union (SACU)

SOUTH_AFRICA_FIVE <- c("South Africa", "Namibia", "Eswatini", "Botswana", "Lesotho")

ラテンアメリカでジニ指数が大きい4カ国

CHOSEN_COUNTRIES <- c("Suriname", "Belize", "Brazil", "Colombia")

分析

1. 各年毎のデータの数の棒グラフ

df_ed_exp |> drop_na(ed_exp) |> filter(!(iso2c %in% REGION)) |>
  ggplot(aes(year)) + geom_bar()

視覚化

2. 日本の教育費(% of GDP)

df_ed_exp |> filter(country == "Japan") |> 
  drop_na(ed_exp) |> arrange(desc(year))

3. 経年変化

a. 日本

df_ed_exp |> filter(country == "Japan") |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line()

気づいたこと・疑問

  • 1970年代の急激な上昇、1990年ごろの急激な現象は、何が原因なのだろう。

  • 2014年ごろから減少、2018年ごろから増加、2020年から2021年は減少。

b. 南部アフリカ関税同盟

df_ed_exp |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_ed_exp |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

気づいたこと・疑問

  • 平均で見ると、上昇してきており、7% 程度という大きな割合になっている。

c. ラテンアメリカ4カ国

df_ed_exp |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_ed_exp |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

分布

データの数から、まずは、2020年について見てみる。

df_ed_exp |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(ed_exp) |>
  ggplot(aes(ed_exp)) + geom_histogram(binwidth = 1)

参考:SACU の5カ国の値を縦線で書き込むには下のようにします。

df_ed_exp |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) 

参考:日本とSACU の5カ国の値を縦線で書き込むには下のようにします。

JP <- 3.416981
SAF <- df_ed_exp |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) |> pull(ed_exp)
df_ed_exp |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(ed_exp) |>
  ggplot() + geom_histogram(aes(ed_exp), binwidth = 1) +
  geom_vline(xintercept = SAF, col = "red") + geom_vline(xintercept = JP, col = "blue") +labs(title = "2020年の教育費の対GDP百分率", subtitle = "日本:青、SACU:赤")

データが十分ある最近の年の値の10カ国の値の棒グラフ

a. 値が大きい方から

df_ed_exp |> filter(year == 2020) |> drop_na(ed_exp) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(desc(ed_exp)) |> head(10) |> 
  ggplot(aes(fct_reorder(country, ed_exp), ed_exp)) + geom_col() + 
  coord_flip() + labs(title = "Top 10 Countries", x = "country", y = "Government expenditure on education, total (% of GDP)")

b. 値が小さい方から

df_ed_exp |> filter(year == 2020) |> drop_na(ed_exp) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(ed_exp) |> head(10) |> 
  ggplot(aes(fct_rev(fct_reorder(country, ed_exp)), ed_exp)) + geom_col() + 
  coord_flip() + labs(title = "Lowest 10 Countries", x = "country", y = "Government expenditure on education, total (% of GDP)")
LS0tCnRpdGxlOiAi5o6i57Si55qE44OH44O844K/5YiG5p6QMCAtIEVEQTAiCmF1dGhvcjogIkguIFN1enVraSIKZGF0ZTogIjIwMjTlubQx5pyIMjPml6UiCm91dHB1dDoKICBodG1sX25vdGVib29rOiBkZWZhdWx0Ci0tLQoKIyMg6Kqy6aGMCgrku6XkuIvjga7mjIfmqJnjga7kuK3jgYvjgonjgIHkuIDjgaTjgpLpgbjmip7jgZfjgabjgIHjg4fjg7zjgr/jga7mpoLopoHvvIhkZXNjcmlwdGlvbu+8ieOCkuiomOmMsuOBl+OAgeODh+ODvOOCv+OCkiBXREkg44Gn5Y+W5b6X44GX44CB5Lul5LiL44Gu5YiG5p6Q44KS44GZ44KL44CCCgoxLiAg5ZCE5bm05q+O44Gu44OH44O844K/44Gu5pWw44Gu5qOS44Kw44Op44OVCjIuICDml6XmnKzjga7jg4fjg7zjgr/jga7lubTjga7pmY3poIbjgafjga7ooajnpLoKMy4gIOe1jOW5tOWkieWMluOCkuihqOOBmeaKmOOCjOe3muOCsOODqeODlQogICAgYS4gIOaXpeacrAogICAgYi4gIOWNl+mDqOOCouODleODquOCq+mWoueojuWQjOebn+OBru+8leOCq+WbvQogICAgYy4gIOmBuOaKnuOBl+OBn+OBhOOBj+OBpOOBi+OBruWbvQo0LiAg44OH44O844K/44GM5Y2B5YiG44GC44KL5pyA6L+R44Gu5bm044Gu5YCk44Gu44OS44K544OI44Kw44Op44OgCjUuICDjg4fjg7zjgr/jgYzljYHliIbjgYLjgovmnIDov5Hjga7lubTjga7lgKTjga4xMOOCq+WbveOBruWApOOBruajkuOCsOODqeODlQogICAgYS4gIOWApOOBjOWkp+OBjeOBhOaWueOBi+OCiQogICAgYi4gIOWApOOBjOWwj+OBleOBhOaWueOBi+OCiQoK44Gd44KM44Ge44KM44Gr44Gk44GE44Gm6ICD5a+f77yI5rCX44Gl44GE44Gf44GT44Go44CB55aR5ZWP44Gq44Gp77yJ44KS6KiY44GZCgoqKjIwMjMuMS4yNS4gMjM6NTkqKiDjgb7jgafjgasgTW9vZGxlIOOBrua8lOe/kuOBruiqsumhjOODnOODg+OCr+OCueOBq+aPkOWHuuOBl+OBn+OCguOBruOBq+OBpOOBhOOBpuOBr+OAgeOBquOCi+OBueOBj+OAgeaXqeOBj+imi+OBpuOAgeODleOCo+ODvOODieODkOODg+OCr+OCkuabuOOBjeOBvuOBmeOAguOBneOCjOS7pemZjeOBq+aPkOWHuuOBleOCjOOBn+OCguOBruOCguimi+OBvuOBmeOBjOOAgeODleOCo+ODvOODieODkOODg+OCr+OBr+mBheOBj+OBquOCi+OBqOaAneOBo+OBpuOBj+OBoOOBleOBhOOAggoKIyMjIOODh+ODvOOCvwoKMS4gIEdvdmVybm1lbnQgZXhwZW5kaXR1cmUgb24gZWR1Y2F0aW9uLCB0b3RhbCAoJSBvZiBHRFAp77yaU0UuWFBELlRPVEwuR0QuWlMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0UuWFBELlRPVEwuR0QuWlMpXQoKMi4gIFNjaG9vbCBlbnJvbGxtZW50LCBwcmltYXJ5ICglIGdyb3NzKe+8mlNFLlBSTS5FTlJSIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NFLlBSTS5FTlJSKV0KCjMuICBTY2hvb2wgZW5yb2xsbWVudCwgc2Vjb25kYXJ5ICglIGdyb3NzKe+8mlNFLlNFQy5FTlJSIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NFLlNFQy5FTlJSKV0KCjQuICBTY2hvb2wgZW5yb2xsbWVudCwgdGVydGlhcnkgKCUgZ3Jvc3Mp77yaU0UuVEVSLkVOUlIgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0UuVEVSLkVOUlIpXQoKNS4gIE1vcnRhbGl0eSByYXRlLCB1bmRlci01IChwZXIgMSwwMDAgbGl2ZSBiaXJ0aHMp77yaU0guRFlOLk1PUlQgW1tMaW5rXShodHRwczovL2RhdGFiYW5rLndvcmxkYmFuay5vcmcvbWV0YWRhdGFnbG9zc2FyeS93b3JsZC1kZXZlbG9wbWVudC1pbmRpY2F0b3JzL3Nlcmllcy9TSC5EWU4uTU9SVCldCgo2LiAgU2Nob29sIGVucm9sbG1lbnQsIHByaW1hcnkgYW5kIHNlY29uZGFyeSAoZ3Jvc3MpLCBnZW5kZXIgcGFyaXR5IGluZGV4IChHUEkp77yaU0UuRU5SLlBSU0MuRk0uWlMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0UuRU5SLlBSU0MuRk0uWlMpXQoKNy4gIFJhdGlvIG9mIGZlbWFsZSB0byBtYWxlIGxhYm9yIGZvcmNlIHBhcnRpY2lwYXRpb24gcmF0ZSAoJSkgKG1vZGVsZWQgSUxPIGVzdGltYXRlKe+8mlNMLlRMRi5DQUNULkZNLlpTIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NMLlRMRi5DQUNULkZNLlpTKV0KCjguICBVbmVtcGxveW1lbnQsIGZlbWFsZSAoJSBvZiBmZW1hbGUgbGFib3IgZm9yY2UpIChtb2RlbGVkIElMTyBlc3RpbWF0ZSnvvJpTTC5VRU0uVE9UTC5GRS5aUyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TTC5VRU0uVE9UTC5GRS5aUyldCgo5LiAgVW5lbXBsb3ltZW50LCBtYWxlICglIG9mIG1hbGUgbGFib3IgZm9yY2UpIChtb2RlbGVkIElMTyBlc3RpbWF0ZSnvvJpTTC5VRU0uVE9UTC5NQS5aUyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TTC5VRU0uVE9UTC5NQS5aUyldCgoxMC4gTmV0IG9mZmljaWFsIGRldmVsb3BtZW50IGFzc2lzdGFuY2UgYW5kIG9mZmljaWFsIGFpZCByZWNlaXZlZCAoY3VycmVudCBVU1wkKSBEVC5PREEuQUxMRC5DRCBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9EVC5PREEuQUxMRC5DRCldCgojIDEuIOWbveOBruaVmeiCsuOBq+mWouOBmeOCi+aUr+WHugoKPiDmpoLopoHvvJrlm73lhoXnt4/nlJ/nlKPvvIhHRFDvvInjgavlr77jgZnjgovjgIHlm73jga7mlZnogrLjgavplqLjgZnjgovmlK/lh7rvvIhHb3Zlcm5tZW50IGV4cGVuZGl0dXJlIG9uIGVkdWNhdGlvbiwgdG90YWwgKCUgb2YgR0RQKe+8ieOBruODh+ODvOOCv+OBruWIhuaekOOCkuihjOOBhgoKIyMg44OH44O844K/CgojIyMg44OH44O844K/5oOF5aCxCgotICAgR292ZXJubWVudCBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24sIHRvdGFsICglIG9mIEdEUCnvvJpTRS5YUEQuVE9UTC5HRC5aUyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TRS5YUEQuVE9UTC5HRC5aUyldCgotICAg44OH44O844K/5ZCN77ya5Zu944Gu5pWZ6IKy6Zai6YCj5pSv5Ye677yIR0RQ5q+UICXvvIkKCi0gICDjg4fjg7zjgr/jgrPjg7zjg4nvvJpTRS5YUEQuVE9UTC5HRC5aUwoKLSAgIOWkieaVsOWQje+8mmBlZF9leHBgCgotICAg5qaC6KaB77ya5pWZ6IKy44Gr5a++44GZ44KL5pS/5bqc44Gu5LiA6Iis5pSv5Ye677yI57WM5bi444CB6LOH5pys44CB56e76Lui77yJ44GvIEdEUCDjga7libLlkIjjgafooajjgZXjgozjgb7jgZnjgILjgZPjgozjgavjga/jgIHlm73pmpvos4fph5HmupDjgYvjgonmlL/lupzjgbjjga7pgIHph5HjgavjgojjgaPjgabos4fph5Hmj5DkvpvjgZXjgozjgZ/mlK/lh7rjgYzlkKvjgb7jgozjgb7jgZnjgILkuIDoiKzmlL/lupzjgajjga/pgJrluLjjgIHlnLDmlrnoh6rmsrvkvZPjgIHlnLDln5/mlL/lupzjgIHkuK3lpK7mlL/lupzjgpLmjIfjgZfjgb7jgZnjgIIKCiMjIyDjg4fjg7zjgr/jga7lj5blvpcKCiMjIyMg5rqW5YKZCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoV0RJKQpgYGAKCldESSDjg5Hjg4PjgrHjg7zjgrjjgpLkvb/jgaPjgabjgIHnm7TmjqXjg4fjg7zjgr/jgpLjg4Djgqbjg7Pjg63jg7zjg4njgZfjgIHlpInmlbDlkI3jgpLjgIFgZWRfZXhwYCDjgavmjIflrprjgIIKCmBgYHtyIGV2YWwgPSBGQUxTRX0KZGZfZWRfZXhwIDwtIFdESShpbmRpY2F0b3IgPSBjKGVkX2V4cCA9ICJTRS5YUEQuVE9UTC5HRC5aUyIpKQpgYGAKCmBgYHtyIGV2YWwgPSBGQUxTRX0Kd3JpdGVfY3N2KGRmX2VkX2V4cCwgImRhdGEvZWRfZXhwLmNzdiIpCmBgYAoKYGBge3J9CmRmX2VkX2V4cCA8LSByZWFkX2NzdigiZGF0YS9lZF9leHAuY3N2IikKYGBgCgojIyMg44OH44O844K/44Gu56K66KqNCgpgYGB7cn0KZGZfZWRfZXhwCmBgYAoKYGBge3J9CnN0cihkZl9lZF9leHApCmBgYAoKYGBge3J9ClJFR0lPTiA8LSBjKCIxQSIsICIxVyIsICI0RSIsICI3RSIsICI4UyIsICJCOCIsICJFVSIsICJGMSIsICJPRSIsICJTMSIsIAoiUzIiLCAiUzMiLCAiUzQiLCAiVDIiLCAiVDMiLCAiVDQiLCAiVDUiLCAiVDYiLCAiVDciLCAiVjEiLCAiVjIiLCAKIlYzIiwgIlY0IiwgIlhDIiwgIlhEIiwgIlhFIiwgIlhGIiwgIlhHIiwgIlhIIiwgIlhJIiwgIlhKIiwgIlhMIiwgCiJYTSIsICJYTiIsICJYTyIsICJYUCIsICJYUSIsICJYVCIsICJYVSIsICJYWSIsICJaNCIsICJaNyIsICJaRiIsIAoiWkciLCAiWkgiLCAiWkkiLCAiWkoiLCAiWlEiLCAiWlQiKQpgYGAKCmBgYHtyfQpkZl9lZF9leHAgfD4gZmlsdGVyKGlzbzJjICVpbiUgUkVHSU9OKSB8PiBkaXN0aW5jdChjb3VudHJ5LCBpc28yYykKYGBgCgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZGlzdGluY3QoY291bnRyeSwgaXNvMmMpCmBgYAoKIyMjIOWIhuaekOOBmeOCi+WbveOBruODquOCueODiAoKIyMjIyAqKuWNl+mDqOOCouODleODquOCq+mWoueojuWQjOebnyoqIFRoZSBTb3V0aGVybiBBZnJpY2FuIEN1c3RvbXMgVW5pb24gKFNBQ1UpCgpgYGB7cn0KU09VVEhfQUZSSUNBX0ZJVkUgPC0gYygiU291dGggQWZyaWNhIiwgIk5hbWliaWEiLCAiRXN3YXRpbmkiLCAiQm90c3dhbmEiLCAiTGVzb3RobyIpCmBgYAoKIyMjIyDjg6njg4bjg7PjgqLjg6Hjg6rjgqvjgafjgrjjg4vmjIfmlbDjgYzlpKfjgY3jgYTvvJTjgqvlm70KCmBgYHtyfQpDSE9TRU5fQ09VTlRSSUVTIDwtIGMoIlN1cmluYW1lIiwgIkJlbGl6ZSIsICJCcmF6aWwiLCAiQ29sb21iaWEiKQpgYGAKCiMjIOWIhuaekAoKIyMjIDEuIOWQhOW5tOavjuOBruODh+ODvOOCv+OBruaVsOOBruajkuOCsOODqeODlQoKYGBge3J9CmRmX2VkX2V4cCB8PiBkcm9wX25hKGVkX2V4cCkgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PgogIGdncGxvdChhZXMoeWVhcikpICsgZ2VvbV9iYXIoKQpgYGAKCiMjIOimluimmuWMlgoKIyMjIDIuIOaXpeacrOOBruaVmeiCsuiyu++8iCUgb2YgR0RQ77yJCgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcihjb3VudHJ5ID09ICJKYXBhbiIpIHw+IAogIGRyb3BfbmEoZWRfZXhwKSB8PiBhcnJhbmdlKGRlc2MoeWVhcikpCmBgYAoKIyMjIDMuIOe1jOW5tOWkieWMlgoKIyMjIyBhLiDml6XmnKwKCmBgYHtyfQpkZl9lZF9leHAgfD4gZmlsdGVyKGNvdW50cnkgPT0gIkphcGFuIikgfD4gZHJvcF9uYShlZF9leHApIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBlZF9leHApKSArIGdlb21fbGluZSgpCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSAgIDE5NzDlubTku6Pjga7mgKXmv4DjgarkuIrmmIfjgIExOTkw5bm044GU44KN44Gu5oCl5r+A44Gq54++6LGh44Gv44CB5L2V44GM5Y6f5Zug44Gq44Gu44Gg44KN44GG44CCCgotICAgMjAxNOW5tOOBlOOCjeOBi+OCiea4m+WwkeOAgTIwMTjlubTjgZTjgo3jgYvjgonlopfliqDjgIEyMDIw5bm044GL44KJMjAyMeW5tOOBr+a4m+WwkeOAggoKIyMjIyBiLiDljZfpg6jjgqLjg5Xjg6rjgqvplqLnqI7lkIznm58KCmBgYHtyfQpkZl9lZF9leHAgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gZHJvcF9uYShlZF9leHApIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBlZF9leHApKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpCmBgYAoKKirlj4LogIPvvJrlubPlnYfnmoTjgarlgKTjgpLmm7Lnt5rjgafooajjgZnjgZPjgajjgoLlj6/og73jgafjgZnjgIJsb2VzcyDjgpLkvb/jgYbjgajmu5HjgonjgYvjgarmm7Lnt5rjgafov5HkvLzjgZfjgabjgY/jgozjgb7jgZnjgIIqKgoKYGBge3J9CmRmX2VkX2V4cCB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSB8PiBkcm9wX25hKGVkX2V4cCkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIGVkX2V4cCkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkgKwogIGdlb21fc21vb3RoKGZvcm11bGEgPSAneX54JywgbWV0aG9kID0gImxvZXNzIiwgc2UgPSBGQUxTRSkKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAg5bmz5Z2H44Gn6KaL44KL44Go44CB5LiK5piH44GX44Gm44GN44Gm44GK44KK44CBNyUg56iL5bqm44Go44GE44GG5aSn44GN44Gq5Ymy5ZCI44Gr44Gq44Gj44Gm44GE44KL44CCCgojIyMjIGMuIOODqeODhuODs+OCouODoeODquOCq++8lOOCq+WbvQoKYGBge3J9CmRmX2VkX2V4cCB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIENIT1NFTl9DT1VOVFJJRVMpIHw+IGRyb3BfbmEoZWRfZXhwKSB8PgogIGdncGxvdChhZXMoeWVhciwgZWRfZXhwKSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKQpgYGAKCioq5Y+C6ICD77ya5bmz5Z2H55qE44Gq5YCk44KS5puy57ea44Gn6KGo44GZ44GT44Go44KC5Y+v6IO944Gn44GZ44CCbG9lc3Mg44KS5L2/44GG44Go5ruR44KJ44GL44Gq5puy57ea44Gn6L+R5Ly844GX44Gm44GP44KM44G+44GZ44CCKioKCmBgYHtyfQpkZl9lZF9leHAgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBDSE9TRU5fQ09VTlRSSUVTKSB8PiBkcm9wX25hKGVkX2V4cCkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIGVkX2V4cCkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkgKwogIGdlb21fc21vb3RoKGZvcm11bGEgPSAneX54JywgbWV0aG9kID0gImxvZXNzIiwgc2UgPSBGQUxTRSkKYGBgCgojIyMg5YiG5biDCgrjg4fjg7zjgr/jga7mlbDjgYvjgonjgIHjgb7jgZrjga/jgIEyMDIw5bm044Gr44Gk44GE44Gm6KaL44Gm44G/44KL44CCCgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcighKGNvdW50cnkgJWluJSBSRUdJT04pKXw+CiAgZHJvcF9uYShlZF9leHApIHw+CiAgZ2dwbG90KGFlcyhlZF9leHApKSArIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSkKYGBgCgoqKuWPguiAg++8mioqU0FDVSDjga7vvJXjgqvlm73jga7lgKTjgpLnuKbnt5rjgafmm7jjgY3ovrzjgoDjgavjga/kuIvjga7jgojjgYbjgavjgZfjgb7jgZnjgIIKCmBgYHtyfQpkZl9lZF9leHAgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgCmBgYAoKKirlj4LogIPvvJrml6XmnKzjgagqKlNBQ1Ug44Gu77yV44Kr5Zu944Gu5YCk44KS57im57ea44Gn5pu444GN6L6844KA44Gr44Gv5LiL44Gu44KI44GG44Gr44GX44G+44GZ44CCCgpgYGB7cn0KSlAgPC0gMy40MTY5ODEKU0FGIDwtIGRmX2VkX2V4cCB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSB8PiBwdWxsKGVkX2V4cCkKZGZfZWRfZXhwIHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcighKGNvdW50cnkgJWluJSBSRUdJT04pKXw+CiAgZHJvcF9uYShlZF9leHApIHw+CiAgZ2dwbG90KCkgKyBnZW9tX2hpc3RvZ3JhbShhZXMoZWRfZXhwKSwgYmlud2lkdGggPSAxKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gU0FGLCBjb2wgPSAicmVkIikgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBKUCwgY29sID0gImJsdWUiKSArbGFicyh0aXRsZSA9ICIyMDIw5bm044Gu5pWZ6IKy6LK744Gu5a++R0RQ55m+5YiG546HIiwgc3VidGl0bGUgPSAi5pel5pys77ya6Z2S44CBU0FDVe+8mui1pCIpCmBgYAoKIyMjIOODh+ODvOOCv+OBjOWNgeWIhuOBguOCi+acgOi/keOBruW5tOOBruWApOOBrjEw44Kr5Zu944Gu5YCk44Gu5qOS44Kw44Op44OVCgojIyMjIGEuIOWApOOBjOWkp+OBjeOBhOaWueOBi+OCiQoKYGBge3J9CmRmX2VkX2V4cCB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBkcm9wX25hKGVkX2V4cCkgfD4gCiAgZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKXw+CiAgYXJyYW5nZShkZXNjKGVkX2V4cCkpIHw+IGhlYWQoMTApIHw+IAogIGdncGxvdChhZXMoZmN0X3Jlb3JkZXIoY291bnRyeSwgZWRfZXhwKSwgZWRfZXhwKSkgKyBnZW9tX2NvbCgpICsgCiAgY29vcmRfZmxpcCgpICsgbGFicyh0aXRsZSA9ICJUb3AgMTAgQ291bnRyaWVzIiwgeCA9ICJjb3VudHJ5IiwgeSA9ICJHb3Zlcm5tZW50IGV4cGVuZGl0dXJlIG9uIGVkdWNhdGlvbiwgdG90YWwgKCUgb2YgR0RQKSIpCmBgYAoKIyMjIyBiLiDlgKTjgYzlsI/jgZXjgYTmlrnjgYvjgokKCmBgYHtyfQpkZl9lZF9leHAgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZHJvcF9uYShlZF9leHApIHw+IAogIGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSl8PgogIGFycmFuZ2UoZWRfZXhwKSB8PiBoZWFkKDEwKSB8PiAKICBnZ3Bsb3QoYWVzKGZjdF9yZXYoZmN0X3Jlb3JkZXIoY291bnRyeSwgZWRfZXhwKSksIGVkX2V4cCkpICsgZ2VvbV9jb2woKSArIAogIGNvb3JkX2ZsaXAoKSArIGxhYnModGl0bGUgPSAiTG93ZXN0IDEwIENvdW50cmllcyIsIHggPSAiY291bnRyeSIsIHkgPSAiR292ZXJubWVudCBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24sIHRvdGFsICglIG9mIEdEUCkiKQpgYGAKCiMgMi4g5Yid562J5a2m5qCh5bCx5a2m546HCgojIyDjg4fjg7zjgr8KCi0gICBTY2hvb2wgZW5yb2xsbWVudCwgcHJpbWFyeSAoJSBncm9zcynvvJpTRS5QUk0uRU5SUiBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TRS5QUk0uRU5SUildCgojIyMg44OH44O844K/5oOF5aCxCgotICAg44OH44O844K/5ZCN77yaCgotICAg44OH44O844K/44Kz44O844OJ77yaCgotICAg5aSJ5pWw5ZCN77yaCgotICAg5qaC6KaB77yaCgojIyMg44OH44O844K/44Gu5Y+W5b6XCgojIyMjIOa6luWCmQoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KFdESSkKYGBgCgpXREkg44OR44OD44Kx44O844K444KS5L2/44Gj44Gm44CB55u05o6l44OH44O844K/44KS44OA44Km44Oz44Ot44O844OJ44GX44CB5aSJ5pWw5ZCN44KS44CBYGVkX2V4cGAg44Gr5oyH5a6a44CCCgpgYGB7ciBldmFsID0gRkFMU0V9CmRmX3ByaW1hcnkgPC0gV0RJKGluZGljYXRvciA9IGMocHJpbWFyeSA9ICJTRS5QUk0uRU5SUiIpKQpgYGAKCmBgYHtyIGV2YWwgPSBGQUxTRX0Kd3JpdGVfY3N2KGRmX3ByaW1hcnksICJkYXRhL3ByaW1hcnkuY3N2IikKYGBgCgpgYGB7cn0KZGZfcHJpbWFyeSA8LSByZWFkX2NzdigiZGF0YS9wcmltYXJ5LmNzdiIpCmBgYAoKIyMjIOODh+ODvOOCv+OBrueiuuiqjQoKYGBge3J9CmRmX3ByaW1hcnkKYGBgCgpgYGB7cn0Kc3RyKGRmX3ByaW1hcnkpCmBgYAoKYGBge3J9ClJFR0lPTiA8LSBjKCIxQSIsICIxVyIsICI0RSIsICI3RSIsICI4UyIsICJCOCIsICJFVSIsICJGMSIsICJPRSIsICJTMSIsIAoiUzIiLCAiUzMiLCAiUzQiLCAiVDIiLCAiVDMiLCAiVDQiLCAiVDUiLCAiVDYiLCAiVDciLCAiVjEiLCAiVjIiLCAKIlYzIiwgIlY0IiwgIlhDIiwgIlhEIiwgIlhFIiwgIlhGIiwgIlhHIiwgIlhIIiwgIlhJIiwgIlhKIiwgIlhMIiwgCiJYTSIsICJYTiIsICJYTyIsICJYUCIsICJYUSIsICJYVCIsICJYVSIsICJYWSIsICJaNCIsICJaNyIsICJaRiIsIAoiWkciLCAiWkgiLCAiWkkiLCAiWkoiLCAiWlEiLCAiWlQiKQpgYGAKCmBgYHtyfQpkZl9wcmltYXJ5IHw+IGZpbHRlcihpc28yYyAlaW4lIFJFR0lPTikgfD4gZGlzdGluY3QoY291bnRyeSwgaXNvMmMpCmBgYAoKIyMjIOWIhuaekOOBmeOCi+WbveOBruODquOCueODiAoKIyMjIyAqKuWNl+mDqOOCouODleODquOCq+mWoueojuWQjOebnyoqIFRoZSBTb3V0aGVybiBBZnJpY2FuIEN1c3RvbXMgVW5pb24gKFNBQ1UpCgpgYGB7cn0KU09VVEhfQUZSSUNBX0ZJVkUgPC0gYygiU291dGggQWZyaWNhIiwgIk5hbWliaWEiLCAiRXN3YXRpbmkiLCAiQm90c3dhbmEiLCAiTGVzb3RobyIpCmBgYAoKIyMjIyDjg6njg4bjg7PjgqLjg6Hjg6rjgqvjgafjgrjjg4vmjIfmlbDjgYzlpKfjgY3jgYTvvJTjgqvlm70KCmBgYHtyfQpDSE9TRU5fQ09VTlRSSUVTIDwtIGMoIlN1cmluYW1lIiwgIkJlbGl6ZSIsICJCcmF6aWwiLCAiQ29sb21iaWEiKQpgYGAKCiMjIOWIhuaekAoKIyMjIDEuIOWQhOW5tOavjuOBruODh+ODvOOCv+OBruaVsOOBruajkuOCsOODqeODlQoKYGBge3J9CmRmX3ByaW1hcnkgfD4gZHJvcF9uYShwcmltYXJ5KSB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyKSkgKyBnZW9tX2JhcigpCmBgYAoKIyMg6KaW6Kaa5YyWCgojIyMgMi4g5pel5pys44Gu5Yid562J5a2m5qCh5bCx5a2m546HCgpgYGB7cn0KZGZfcHJpbWFyeSB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PiAKICBkcm9wX25hKHByaW1hcnkpIHw+IGFycmFuZ2UoZGVzYyh5ZWFyKSkKYGBgCgojIyMgMy4g57WM5bm05aSJ5YyWCgojIyMjIGEuIOaXpeacrAoKYGBge3J9CmRmX3ByaW1hcnkgfD4gZmlsdGVyKGNvdW50cnkgPT0gIkphcGFuIikgfD4gZHJvcF9uYShwcmltYXJ5KSB8PgogIGdncGxvdChhZXMoeWVhciwgcHJpbWFyeSkpICsgZ2VvbV9saW5lKCkKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAgMTk3MOW5tOS7o+OBruaApea/gOOBquS4iuaYh+ODu+S4i+mZjeOAgTE5ODDlubTjgZTjgo3jgYvjgonkuIrmmIfjgIHjgZ3jgZPjgafjgIExMDAg44KS6LaF44GI44Gm44GE44KL44CCMTk5NeW5tOOBlOOCjeOBi+OCieOBr+OAgea4m+WwkeOBl+OBpuOBhOOCi+OBjOOAgeOBvuOBoOOAgTEwMOS7peS4iuOBp+OBguOCi+OAguS9leOBjOWOn+WboOOBquOBruOBoOOCjeOBhuOAggoKIyMjIyBiLiDljZfpg6jjgqLjg5Xjg6rjgqvplqLnqI7lkIznm58KCmBgYHtyfQpkZl9wcmltYXJ5IHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIHw+IGRyb3BfbmEocHJpbWFyeSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHByaW1hcnkpKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpCmBgYAoKKirlj4LogIPvvJrlubPlnYfnmoTjgarlgKTjgpLmm7Lnt5rjgafooajjgZnjgZPjgajjgoLlj6/og73jgafjgZnjgIJsb2VzcyDjgpLkvb/jgYbjgajmu5HjgonjgYvjgarmm7Lnt5rjgafov5HkvLzjgZfjgabjgY/jgozjgb7jgZnjgIIqKgoKYGBge3J9CmRmX3ByaW1hcnkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gZHJvcF9uYShwcmltYXJ5KSB8PgogIGdncGxvdChhZXMoeWVhciwgcHJpbWFyeSkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkgKwogIGdlb21fc21vb3RoKGZvcm11bGEgPSAneX54JywgbWV0aG9kID0gImxvZXNzIiwgc2UgPSBGQUxTRSkKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAgMTAw44KS6LaF44GI44Gm44GE44KL44CCCgojIyMjIGMuIOODqeODhuODs+OCouODoeODquOCq++8lOOCq+WbvQoKYGBge3J9CmRmX3ByaW1hcnkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBDSE9TRU5fQ09VTlRSSUVTKSB8PiBkcm9wX25hKHByaW1hcnkpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBwcmltYXJ5KSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKQpgYGAKCioq5Y+C6ICD77ya5bmz5Z2H55qE44Gq5YCk44KS5puy57ea44Gn6KGo44GZ44GT44Go44KC5Y+v6IO944Gn44GZ44CCbG9lc3Mg44KS5L2/44GG44Go5ruR44KJ44GL44Gq5puy57ea44Gn6L+R5Ly844GX44Gm44GP44KM44G+44GZ44CCKioKCmBgYHtyfQpkZl9wcmltYXJ5IHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgQ0hPU0VOX0NPVU5UUklFUykgfD4gZHJvcF9uYShwcmltYXJ5KSB8PgogIGdncGxvdChhZXMoeWVhciwgcHJpbWFyeSkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkgKwogIGdlb21fc21vb3RoKGZvcm11bGEgPSAneX54JywgbWV0aG9kID0gImxvZXNzIiwgc2UgPSBGQUxTRSkKYGBgCgojIyMg5YiG5biDCgrjg4fjg7zjgr/jga7mlbDjgYvjgonjgIHjgb7jgZrjga/jgIEyMDIw5bm044Gr44Gk44GE44Gm6KaL44Gm44G/44KL44CCCgpgYGB7cn0KZGZfcHJpbWFyeSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoIShjb3VudHJ5ICVpbiUgUkVHSU9OKSl8PgogIGRyb3BfbmEocHJpbWFyeSkgfD4KICBnZ3Bsb3QoYWVzKHByaW1hcnkpKSArIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gNSkKYGBgCgoqKuWPguiAg++8mioqU0FDVSDjga7vvJXjgqvlm73jga7lgKTjgpLnuKbnt5rjgafmm7jjgY3ovrzjgoDjgavjga/kuIvjga7jgojjgYbjgavjgZfjgb7jgZnjgIIKCmBgYHtyfQpkZl9wcmltYXJ5IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIApgYGAKCioq5Y+C6ICD77ya5pel5pys44GoKipTQUNVIOOBru+8leOCq+WbveOBruWApOOCkue4pue3muOBp+abuOOBjei+vOOCgOOBq+OBr+S4i+OBruOCiOOBhuOBq+OBl+OBvuOBmeOAggoKYGBge3J9CkpQIDwtIDEwMi43MzY4MwpTQUYgPC0gZGZfcHJpbWFyeSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSB8PiBwdWxsKHByaW1hcnkpCmRmX3ByaW1hcnkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKCEoY291bnRyeSAlaW4lIFJFR0lPTikpfD4KICBkcm9wX25hKHByaW1hcnkpIHw+CiAgZ2dwbG90KCkgKyBnZW9tX2hpc3RvZ3JhbShhZXMocHJpbWFyeSksIGJpbndpZHRoID0gNSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IFNBRiwgY29sID0gInJlZCIpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gSlAsIGNvbCA9ICJibHVlIikgK2xhYnModGl0bGUgPSAiMjAyMOW5tOOBruWIneetieWtpuagoeWwseWtpueOhyIsIHN1YnRpdGxlID0gIuaXpeacrO+8mumdkuOAgVNBQ1XvvJrotaQiKQpgYGAKCiMjIyDjg4fjg7zjgr/jgYzljYHliIbjgYLjgovmnIDov5Hjga7lubTjga7lgKTjga4xMOOCq+WbveOBruWApOOBruajkuOCsOODqeODlQoKIyMjIyBhLiDlgKTjgYzlpKfjgY3jgYTmlrnjgYvjgokKCmBgYHtyfQpkZl9wcmltYXJ5IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGRyb3BfbmEocHJpbWFyeSkgfD4gCiAgZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKXw+CiAgYXJyYW5nZShkZXNjKHByaW1hcnkpKSB8PiBoZWFkKDEwKSB8PiAKICBnZ3Bsb3QoYWVzKGZjdF9yZW9yZGVyKGNvdW50cnksIHByaW1hcnkpLCBwcmltYXJ5KSkgKyBnZW9tX2NvbCgpICsgCiAgY29vcmRfZmxpcCgpICsgbGFicyh0aXRsZSA9ICJUb3AgMTAgQ291bnRyaWVzIiwgeCA9ICJjb3VudHJ5IiwgeSA9ICLliJ3nrYnlrabmoKHlsLHlrabnjociKQpgYGAKCiMjIyMgYi4g5YCk44GM5bCP44GV44GE5pa544GL44KJCgpgYGB7cn0KZGZfcHJpbWFyeSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBkcm9wX25hKHByaW1hcnkpIHw+IAogIGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSl8PgogIGFycmFuZ2UocHJpbWFyeSkgfD4gaGVhZCgxMCkgfD4gCiAgZ2dwbG90KGFlcyhmY3RfcmV2KGZjdF9yZW9yZGVyKGNvdW50cnksIHByaW1hcnkpKSwgcHJpbWFyeSkpICsgZ2VvbV9jb2woKSArIAogIGNvb3JkX2ZsaXAoKSArIGxhYnModGl0bGUgPSAiTG93ZXN0IDEwIENvdW50cmllcyIsIHggPSAiY291bnRyeSIsIHkgPSAi5Yid562J5a2m5qCh5bCx5a2m546HIikKYGBgCgojIDMuIOS4reetieWtpuagoeWwseWtpueOhwoKIyMg44OH44O844K/CgotICAgU2Nob29sIGVucm9sbG1lbnQsIHNlY29uZGFyeSAoJSBncm9zcynvvJpTRS5TRUMuRU5SUiBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TRS5TRUMuRU5SUildCgojIyMg44OH44O844K/5oOF5aCxCgotICAg44OH44O844K/5ZCN77yaCgotICAg44OH44O844K/44Kz44O844OJ77yaCgotICAg5aSJ5pWw5ZCN77yaCgotICAg5qaC6KaB77yaCgojIyMg44OH44O844K/44Gu5Y+W5b6XCgojIyMjIOa6luWCmQoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KFdESSkKYGBgCgpXREkg44OR44OD44Kx44O844K444KS5L2/44Gj44Gm44CB55u05o6l44OH44O844K/44KS44OA44Km44Oz44Ot44O844OJ44GX44CB5aSJ5pWw5ZCN44KS44CBYGVkX2V4cGAg44Gr5oyH5a6a44CCCgpgYGB7ciBldmFsID0gRkFMU0V9CmRmX3NlY29uZGFyeSA8LSBXREkoaW5kaWNhdG9yID0gYyhzZWNvbmRhcnkgPSAiU0UuU0VDLkVOUlIiKSkKYGBgCgpgYGB7ciBldmFsID0gRkFMU0V9CndyaXRlX2NzdihkZl9zZWNvbmRhcnksICJkYXRhL3NlY29uZGFyeS5jc3YiKQpgYGAKCmBgYHtyfQpkZl9zZWNvbmRhcnkgPC0gcmVhZF9jc3YoImRhdGEvc2Vjb25kYXJ5LmNzdiIpCmBgYAoKIyMjIOODh+ODvOOCv+OBrueiuuiqjQoKYGBge3J9CmRmX3NlY29uZGFyeQpgYGAKCmBgYHtyfQpzdHIoZGZfc2Vjb25kYXJ5KQpgYGAKCmBgYHtyfQpSRUdJT04gPC0gYygiMUEiLCAiMVciLCAiNEUiLCAiN0UiLCAiOFMiLCAiQjgiLCAiRVUiLCAiRjEiLCAiT0UiLCAiUzEiLCAKIlMyIiwgIlMzIiwgIlM0IiwgIlQyIiwgIlQzIiwgIlQ0IiwgIlQ1IiwgIlQ2IiwgIlQ3IiwgIlYxIiwgIlYyIiwgCiJWMyIsICJWNCIsICJYQyIsICJYRCIsICJYRSIsICJYRiIsICJYRyIsICJYSCIsICJYSSIsICJYSiIsICJYTCIsIAoiWE0iLCAiWE4iLCAiWE8iLCAiWFAiLCAiWFEiLCAiWFQiLCAiWFUiLCAiWFkiLCAiWjQiLCAiWjciLCAiWkYiLCAKIlpHIiwgIlpIIiwgIlpJIiwgIlpKIiwgIlpRIiwgIlpUIikKYGBgCgpgYGB7cn0KZGZfc2Vjb25kYXJ5IHw+IGZpbHRlcihpc28yYyAlaW4lIFJFR0lPTikgfD4gZGlzdGluY3QoY291bnRyeSwgaXNvMmMpCmBgYAoKYGBge3J9CmRmX3NlY29uZGFyeSB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IGRpc3RpbmN0KGNvdW50cnksIGlzbzJjKQpgYGAKCiMjIyDliIbmnpDjgZnjgovlm73jga7jg6rjgrnjg4gKCiMjIyMgKirljZfpg6jjgqLjg5Xjg6rjgqvplqLnqI7lkIznm58qKiBUaGUgU291dGhlcm4gQWZyaWNhbiBDdXN0b21zIFVuaW9uIChTQUNVKQoKYGBge3J9ClNPVVRIX0FGUklDQV9GSVZFIDwtIGMoIlNvdXRoIEFmcmljYSIsICJOYW1pYmlhIiwgIkVzd2F0aW5pIiwgIkJvdHN3YW5hIiwgIkxlc290aG8iKQpgYGAKCiMjIyMg44Op44OG44Oz44Ki44Oh44Oq44Kr44Gn44K444OL5oyH5pWw44GM5aSn44GN44GE77yU44Kr5Zu9CgpgYGB7cn0KQ0hPU0VOX0NPVU5UUklFUyA8LSBjKCJTdXJpbmFtZSIsICJCZWxpemUiLCAiQnJhemlsIiwgIkNvbG9tYmlhIikKYGBgCgojIyDliIbmnpAKCiMjIyAxLiDlkITlubTmr47jga7jg4fjg7zjgr/jga7mlbDjga7mo5LjgrDjg6njg5UKCmBgYHtyfQpkZl9zZWNvbmRhcnkgfD4gZHJvcF9uYShzZWNvbmRhcnkpIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIpKSArIGdlb21fYmFyKCkKYGBgCgojIyDoppbopprljJYKCiMjIyAyLiDml6XmnKzjga7kuK3nrYnlrabmoKHlsLHlrabnjocKCmBgYHtyfQpkZl9zZWNvbmRhcnkgfD4gZmlsdGVyKGNvdW50cnkgPT0gIkphcGFuIikgfD4gCiAgZHJvcF9uYShzZWNvbmRhcnkpIHw+IGFycmFuZ2UoZGVzYyh5ZWFyKSkKYGBgCgojIyMgMy4g57WM5bm05aSJ5YyWCgojIyMjIGEuIOaXpeacrAoKYGBge3J9CmRmX3NlY29uZGFyeSB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PiBkcm9wX25hKHNlY29uZGFyeSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHNlY29uZGFyeSkpICsgZ2VvbV9saW5lKCkKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAgMjAwMOW5tOOBlOOCjeOBi+OCiea4m+WwkeOAgeOBneOBruW+jOOCguWkieWMluOBjOOBguOCi+OAguS9leOBjOWOn+WboOOBquOBruOBoOOCjeOBhuOAggoKIyMjIyBiLiDljZfpg6jjgqLjg5Xjg6rjgqvplqLnqI7lkIznm58KCmBgYHtyfQpkZl9zZWNvbmRhcnkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gZHJvcF9uYShzZWNvbmRhcnkpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBzZWNvbmRhcnkpKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpCmBgYAoKKirlj4LogIPvvJrlubPlnYfnmoTjgarlgKTjgpLmm7Lnt5rjgafooajjgZnjgZPjgajjgoLlj6/og73jgafjgZnjgIJsb2VzcyDjgpLkvb/jgYbjgajmu5HjgonjgYvjgarmm7Lnt5rjgafov5HkvLzjgZfjgabjgY/jgozjgb7jgZnjgIIqKgoKYGBge3J9CmRmX3NlY29uZGFyeSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSB8PiBkcm9wX25hKHNlY29uZGFyeSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHNlY29uZGFyeSkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkgKwogIGdlb21fc21vb3RoKGZvcm11bGEgPSAneX54JywgbWV0aG9kID0gImxvZXNzIiwgc2UgPSBGQUxTRSkKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAg5bmz5Z2H44Gn6KaL44KL44Go44CB5LiA5a6a44GX44Gm5LiK5piH44GX44Gm44GE44KL44CCCgojIyMjIGMuIOODqeODhuODs+OCouODoeODquOCq++8lOOCq+WbvQoKYGBge3J9CmRmX3NlY29uZGFyeSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIENIT1NFTl9DT1VOVFJJRVMpIHw+IGRyb3BfbmEoc2Vjb25kYXJ5KSB8PgogIGdncGxvdChhZXMoeWVhciwgc2Vjb25kYXJ5KSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKQpgYGAKCioq5Y+C6ICD77ya5bmz5Z2H55qE44Gq5YCk44KS5puy57ea44Gn6KGo44GZ44GT44Go44KC5Y+v6IO944Gn44GZ44CCbG9lc3Mg44KS5L2/44GG44Go5ruR44KJ44GL44Gq5puy57ea44Gn6L+R5Ly844GX44Gm44GP44KM44G+44GZ44CCKioKCmBgYHtyfQpkZl9zZWNvbmRhcnkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBDSE9TRU5fQ09VTlRSSUVTKSB8PiBkcm9wX25hKHNlY29uZGFyeSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHNlY29uZGFyeSkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkgKwogIGdlb21fc21vb3RoKGZvcm11bGEgPSAneX54JywgbWV0aG9kID0gImxvZXNzIiwgc2UgPSBGQUxTRSkKYGBgCgojIyMg5YiG5biDCgrjg4fjg7zjgr/jga7mlbDjgYvjgonjgIHjgb7jgZrjga/jgIEyMDIw5bm044Gr44Gk44GE44Gm6KaL44Gm44G/44KL44CCCgpgYGB7cn0KZGZfc2Vjb25kYXJ5IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcighKGNvdW50cnkgJWluJSBSRUdJT04pKXw+CiAgZHJvcF9uYShzZWNvbmRhcnkpIHw+CiAgZ2dwbG90KGFlcyhzZWNvbmRhcnkpKSArIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMTApCmBgYAoKKirlj4LogIPvvJoqKlNBQ1Ug44Gu77yV44Kr5Zu944Gu5YCk44KS57im57ea44Gn5pu444GN6L6844KA44Gr44Gv5LiL44Gu44KI44GG44Gr44GX44G+44GZ44CCCgpgYGB7cn0KZGZfc2Vjb25kYXJ5IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIApgYGAKCioq5Y+C6ICD77ya5pel5pys44GoKipTQUNVIOOBru+8leOCq+WbveOBruWApOOCkue4pue3muOBp+abuOOBjei+vOOCgOOBq+OBr+S4i+OBruOCiOOBhuOBq+OBl+OBvuOBmeOAggoKYGBge3J9CkpQIDwtIDEwMi44NDQ4MApTQUYgPC0gZGZfc2Vjb25kYXJ5IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIHw+IHB1bGwoc2Vjb25kYXJ5KQpkZl9zZWNvbmRhcnkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKCEoY291bnRyeSAlaW4lIFJFR0lPTikpfD4KICBkcm9wX25hKHNlY29uZGFyeSkgfD4KICBnZ3Bsb3QoKSArIGdlb21faGlzdG9ncmFtKGFlcyhzZWNvbmRhcnkpLCBiaW53aWR0aCA9IDEwKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gU0FGLCBjb2wgPSAicmVkIikgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBKUCwgY29sID0gImJsdWUiKSArbGFicyh0aXRsZSA9ICIyMDIw5bm044Gu5Lit562J5a2m5qCh5bCx5a2m546HIiwgc3VidGl0bGUgPSAi5pel5pys77ya6Z2S44CBU0FDVe+8mui1pCIpCmBgYAoKIyMjIOODh+ODvOOCv+OBjOWNgeWIhuOBguOCi+acgOi/keOBruW5tOOBruWApOOBrjEw44Kr5Zu944Gu5YCk44Gu5qOS44Kw44Op44OVCgojIyMjIGEuIOWApOOBjOWkp+OBjeOBhOaWueOBi+OCiQoKYGBge3J9CmRmX3NlY29uZGFyeSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBkcm9wX25hKHNlY29uZGFyeSkgfD4gCiAgZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKXw+CiAgYXJyYW5nZShkZXNjKHNlY29uZGFyeSkpIHw+IGhlYWQoMTApIHw+IAogIGdncGxvdChhZXMoZmN0X3Jlb3JkZXIoY291bnRyeSwgc2Vjb25kYXJ5KSwgc2Vjb25kYXJ5KSkgKyBnZW9tX2NvbCgpICsgCiAgY29vcmRfZmxpcCgpICsgbGFicyh0aXRsZSA9ICJUb3AgMTAgQ291bnRyaWVzIiwgeCA9ICJjb3VudHJ5IiwgeSA9ICJzZWNvbmRhcnkgc2Nob29sIGVucm9sbG1lbnQiKQpgYGAKCiMjIyMgYi4g5YCk44GM5bCP44GV44GE5pa544GL44KJCgpgYGB7cn0KZGZfc2Vjb25kYXJ5IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGRyb3BfbmEoc2Vjb25kYXJ5KSB8PiAKICBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpfD4KICBhcnJhbmdlKHNlY29uZGFyeSkgfD4gaGVhZCgxMCkgfD4gCiAgZ2dwbG90KGFlcyhmY3RfcmV2KGZjdF9yZW9yZGVyKGNvdW50cnksIHNlY29uZGFyeSkpLCBzZWNvbmRhcnkpKSArIGdlb21fY29sKCkgKyAKICBjb29yZF9mbGlwKCkgKyBsYWJzKHRpdGxlID0gIkxvd2VzdCAxMCBDb3VudHJpZXMiLCB4ID0gImNvdW50cnkiLCB5ID0gInNlY29uZGFyeSBzY2hvb2xsIGVucm9sbG1lbnQiKQpgYGAKCiMgNC4g5Lit562J5a2m5qCh5b6M44Gu5bCx5a2m546HCgojIyDjg4fjg7zjgr8KCi0gICBTY2hvb2wgZW5yb2xsbWVudCwgdGVydGlhcnkgKCUgZ3Jvc3Mp77yaU0UuVEVSLkVOUlIgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0UuVEVSLkVOUlIpXQoKIyMjIOODh+ODvOOCv+aDheWgsQoKLSAgIOODh+ODvOOCv+WQje+8mgoKLSAgIOODh+ODvOOCv+OCs+ODvOODie+8mgoKLSAgIOWkieaVsOWQje+8mgoKLSAgIOamguimge+8mgoKIyMjIOODh+ODvOOCv+OBruWPluW+lwoKIyMjIyDmupblgpkKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShXREkpCmBgYAoKV0RJIOODkeODg+OCseODvOOCuOOCkuS9v+OBo+OBpuOAgeebtOaOpeODh+ODvOOCv+OCkuODgOOCpuODs+ODreODvOODieOBl+OAgeWkieaVsOWQjeOCkuOAgWBlZF9leHBgIOOBq+aMh+WumuOAggoKYGBge3IgZXZhbCA9IEZBTFNFfQpkZl90ZXJ0aWFyeSA8LSBXREkoaW5kaWNhdG9yID0gYyh0ZXJ0aWFyeSA9ICJTRS5URVIuRU5SUiIpKQpgYGAKCmBgYHtyIGV2YWwgPSBGQUxTRX0Kd3JpdGVfY3N2KGRmX3RlcnRpYXJ5LCAiZGF0YS90ZXJ0aWFyeS5jc3YiKQpgYGAKCmBgYHtyfQpkZl90ZXJ0aWFyeSA8LSByZWFkX2NzdigiZGF0YS90ZXJ0aWFyeS5jc3YiKQpgYGAKCiMjIyDjg4fjg7zjgr/jga7norroqo0KCmBgYHtyfQpkZl90ZXJ0aWFyeQpgYGAKCmBgYHtyfQpzdHIoZGZfdGVydGlhcnkpCmBgYAoKYGBge3J9ClJFR0lPTiA8LSBjKCIxQSIsICIxVyIsICI0RSIsICI3RSIsICI4UyIsICJCOCIsICJFVSIsICJGMSIsICJPRSIsICJTMSIsIAoiUzIiLCAiUzMiLCAiUzQiLCAiVDIiLCAiVDMiLCAiVDQiLCAiVDUiLCAiVDYiLCAiVDciLCAiVjEiLCAiVjIiLCAKIlYzIiwgIlY0IiwgIlhDIiwgIlhEIiwgIlhFIiwgIlhGIiwgIlhHIiwgIlhIIiwgIlhJIiwgIlhKIiwgIlhMIiwgCiJYTSIsICJYTiIsICJYTyIsICJYUCIsICJYUSIsICJYVCIsICJYVSIsICJYWSIsICJaNCIsICJaNyIsICJaRiIsIAoiWkciLCAiWkgiLCAiWkkiLCAiWkoiLCAiWlEiLCAiWlQiKQpgYGAKCmBgYHtyfQpkZl90ZXJ0aWFyeSB8PiBmaWx0ZXIoaXNvMmMgJWluJSBSRUdJT04pIHw+IGRpc3RpbmN0KGNvdW50cnksIGlzbzJjKQpgYGAKCmBgYHtyfQpkZl90ZXJ0aWFyeSB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IGRpc3RpbmN0KGNvdW50cnksIGlzbzJjKQpgYGAKCiMjIyDliIbmnpDjgZnjgovlm73jga7jg6rjgrnjg4gKCiMjIyMgKirljZfpg6jjgqLjg5Xjg6rjgqvplqLnqI7lkIznm58qKiBUaGUgU291dGhlcm4gQWZyaWNhbiBDdXN0b21zIFVuaW9uIChTQUNVKQoKYGBge3J9ClNPVVRIX0FGUklDQV9GSVZFIDwtIGMoIlNvdXRoIEFmcmljYSIsICJOYW1pYmlhIiwgIkVzd2F0aW5pIiwgIkJvdHN3YW5hIiwgIkxlc290aG8iKQpgYGAKCiMjIyMg44Op44OG44Oz44Ki44Oh44Oq44Kr44Gn44K444OL5oyH5pWw44GM5aSn44GN44GE77yU44Kr5Zu9CgpgYGB7cn0KQ0hPU0VOX0NPVU5UUklFUyA8LSBjKCJTdXJpbmFtZSIsICJCZWxpemUiLCAiQnJhemlsIiwgIkNvbG9tYmlhIikKYGBgCgojIyDliIbmnpAKCiMjIyAxLiDlkITlubTmr47jga7jg4fjg7zjgr/jga7mlbDjga7mo5LjgrDjg6njg5UKCmBgYHtyfQpkZl90ZXJ0aWFyeSB8PiBkcm9wX25hKHRlcnRpYXJ5KSB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyKSkgKyBnZW9tX2JhcigpCmBgYAoKIyMg6KaW6Kaa5YyWCgojIyMgMi4g5pel5pys44Gu5pWZ6IKy6LK777yIJSBvZiBHRFDvvIkKCmBgYHtyfQpkZl90ZXJ0aWFyeSB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PiAKICBkcm9wX25hKHRlcnRpYXJ5KSB8PiBhcnJhbmdlKGRlc2MoeWVhcikpCmBgYAoKIyMjIDMuIOe1jOW5tOWkieWMlgoKIyMjIyBhLiDml6XmnKwKCmBgYHtyfQpkZl90ZXJ0aWFyeSB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PiBkcm9wX25hKHRlcnRpYXJ5KSB8PgogIGdncGxvdChhZXMoeWVhciwgdGVydGlhcnkpKSArIGdlb21fbGluZSgpCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSAgIDE5NzDlubTku6Pjga7mgKXmv4DjgarkuIrmmIfjgIExOTkw5bm044GU44KN44GL44KJ44G+44Gf5aKX5Yqg44Gv44CB5L2V44GM5Y6f5Zug44Gq44Gu44Gg44KN44GG44CCCgotICAg44Gp44Gu44KI44GG44Gr44CB5Lit562J5a2m5qCh5b6M44Gr44Gk44GE44Gm5a6a44KB44Gm44GE44KL44Gu44Gg44KN44GG44CCCgojIyMjIGIuIOWNl+mDqOOCouODleODquOCq+mWoueojuWQjOebnwoKYGBge3J9CmRmX3RlcnRpYXJ5IHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIHw+IGRyb3BfbmEodGVydGlhcnkpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCB0ZXJ0aWFyeSkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkKYGBgCgoqKuWPguiAg++8muW5s+Wdh+eahOOBquWApOOCkuabsue3muOBp+ihqOOBmeOBk+OBqOOCguWPr+iDveOBp+OBmeOAgmxvZXNzIOOCkuS9v+OBhuOBqOa7keOCieOBi+OBquabsue3muOBp+i/keS8vOOBl+OBpuOBj+OCjOOBvuOBmeOAgioqCgpgYGB7cn0KZGZfdGVydGlhcnkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gZHJvcF9uYSh0ZXJ0aWFyeSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHRlcnRpYXJ5KSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKSArCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9ICd5fngnLCBtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCi0gICDlubPlnYfjgafopovjgovjgajjgIHkuIrmmIfjgZfjgabjgY3jgabjgYrjgorjgIE3JSDnqIvluqbjgajjgYTjgYblpKfjgY3jgarlibLlkIjjgavjgarjgaPjgabjgYTjgovjgIIKCiMjIyMgYy4g44Op44OG44Oz44Ki44Oh44Oq44Kr77yU44Kr5Zu9CgpgYGB7cn0KZGZfdGVydGlhcnkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBDSE9TRU5fQ09VTlRSSUVTKSB8PiBkcm9wX25hKHRlcnRpYXJ5KSB8PgogIGdncGxvdChhZXMoeWVhciwgdGVydGlhcnkpKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpCmBgYAoKKirlj4LogIPvvJrlubPlnYfnmoTjgarlgKTjgpLmm7Lnt5rjgafooajjgZnjgZPjgajjgoLlj6/og73jgafjgZnjgIJsb2VzcyDjgpLkvb/jgYbjgajmu5HjgonjgYvjgarmm7Lnt5rjgafov5HkvLzjgZfjgabjgY/jgozjgb7jgZnjgIIqKgoKYGBge3J9CmRmX3RlcnRpYXJ5IHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgQ0hPU0VOX0NPVU5UUklFUykgfD4gZHJvcF9uYSh0ZXJ0aWFyeSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHRlcnRpYXJ5KSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKSArCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9ICd5fngnLCBtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFKQpgYGAKCiMjIyDliIbluIMKCuODh+ODvOOCv+OBruaVsOOBi+OCieOAgeOBvuOBmuOBr+OAgTIwMjDlubTjgavjgaTjgYTjgabopovjgabjgb/jgovjgIIKCmBgYHtyfQpkZl90ZXJ0aWFyeSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoIShjb3VudHJ5ICVpbiUgUkVHSU9OKSl8PgogIGRyb3BfbmEodGVydGlhcnkpIHw+CiAgZ2dwbG90KGFlcyh0ZXJ0aWFyeSkpICsgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxMCkKYGBgCgoqKuWPguiAg++8mioqU0FDVSDjga7vvJXjgqvlm73jga7lgKTjgpLnuKbnt5rjgafmm7jjgY3ovrzjgoDjgavjga/kuIvjga7jgojjgYbjgavjgZfjgb7jgZnjgIIKCmBgYHtyfQpkZl90ZXJ0aWFyeSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSAKYGBgCgoqKuWPguiAg++8muaXpeacrOOBqCoqU0FDVSDjga7vvJXjgqvlm73jga7lgKTjgpLnuKbnt5rjgafmm7jjgY3ovrzjgoDjgavjga/kuIvjga7jgojjgYbjgavjgZfjgb7jgZnjgIIKCmBgYHtyfQpKUCA8LSA2Mi4xMzU4NApTQUYgPC0gZGZfdGVydGlhcnkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gcHVsbCh0ZXJ0aWFyeSkKZGZfdGVydGlhcnkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKCEoY291bnRyeSAlaW4lIFJFR0lPTikpfD4KICBkcm9wX25hKHRlcnRpYXJ5KSB8PgogIGdncGxvdCgpICsgZ2VvbV9oaXN0b2dyYW0oYWVzKHRlcnRpYXJ5KSwgYmlud2lkdGggPSAxMCkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IFNBRiwgY29sID0gInJlZCIpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gSlAsIGNvbCA9ICJibHVlIikgK2xhYnModGl0bGUgPSAiMjAyMOW5tOOBruS4reetieWtpuagoeW+jOOBruWwseWtpueOhyIsIHN1YnRpdGxlID0gIuaXpeacrO+8mumdkuOAgVNBQ1XvvJrotaQiKQpgYGAKCiMjIyDjg4fjg7zjgr/jgYzljYHliIbjgYLjgovmnIDov5Hjga7lubTjga7lgKTjga4xMOOCq+WbveOBruWApOOBruajkuOCsOODqeODlQoKIyMjIyBhLiDlgKTjgYzlpKfjgY3jgYTmlrnjgYvjgokKCmBgYHtyfQpkZl90ZXJ0aWFyeSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBkcm9wX25hKHRlcnRpYXJ5KSB8PiAKICBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpfD4KICBhcnJhbmdlKGRlc2ModGVydGlhcnkpKSB8PiBoZWFkKDEwKSB8PiAKICBnZ3Bsb3QoYWVzKGZjdF9yZW9yZGVyKGNvdW50cnksIHRlcnRpYXJ5KSwgdGVydGlhcnkpKSArIGdlb21fY29sKCkgKyAKICBjb29yZF9mbGlwKCkgKyBsYWJzKHRpdGxlID0gIlRvcCAxMCBDb3VudHJpZXMiLCB4ID0gImNvdW50cnkiLCB5ID0gInRlcnRpYXJ5IHNjaG9vbCBlbnJvbGxtZW50IikKYGBgCgojIyMjIGIuIOWApOOBjOWwj+OBleOBhOaWueOBi+OCiQoKYGBge3J9CmRmX3RlcnRpYXJ5IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGRyb3BfbmEodGVydGlhcnkpIHw+IAogIGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSl8PgogIGFycmFuZ2UodGVydGlhcnkpIHw+IGhlYWQoMTApIHw+IAogIGdncGxvdChhZXMoZmN0X3JldihmY3RfcmVvcmRlcihjb3VudHJ5LCB0ZXJ0aWFyeSkpLCB0ZXJ0aWFyeSkpICsgZ2VvbV9jb2woKSArIAogIGNvb3JkX2ZsaXAoKSArIGxhYnModGl0bGUgPSAiTG93ZXN0IDEwIENvdW50cmllcyIsIHggPSAiY291bnRyeSIsIHkgPSAidGVydGlhcnkgc2Nob29sIGVucm9sbG1lbnQiKQpgYGAKCiMgNS4g5LqU5q2z5pyq5rqA44Gu5q275Lqh546HCgojIyDjg4fjg7zjgr8KCi0gICBNb3J0YWxpdHkgcmF0ZSwgdW5kZXItNSAocGVyIDEsMDAwIGxpdmUgYmlydGhzKe+8mlNILkRZTi5NT1JUIFtbTGlua10oaHR0cHM6Ly9kYXRhYmFuay53b3JsZGJhbmsub3JnL21ldGFkYXRhZ2xvc3Nhcnkvd29ybGQtZGV2ZWxvcG1lbnQtaW5kaWNhdG9ycy9zZXJpZXMvU0guRFlOLk1PUlQpXQoKIyMjIOODh+ODvOOCv+aDheWgsQoKLSAgIOODh+ODvOOCv+WQje+8mgoKLSAgIOODh+ODvOOCv+OCs+ODvOODie+8mgoKLSAgIOWkieaVsOWQje+8mgoKLSAgIOamguimge+8mgoKIyMjIOODh+ODvOOCv+OBruWPluW+lwoKIyMjIyDmupblgpkKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShXREkpCmBgYAoKV0RJIOODkeODg+OCseODvOOCuOOCkuS9v+OBo+OBpuOAgeebtOaOpeODh+ODvOOCv+OCkuODgOOCpuODs+ODreODvOODieOBl+OAgeWkieaVsOWQjeOCkuOAgWBlZF9leHBgIOOBq+aMh+WumuOAggoKYGBge3IgZXZhbCA9IEZBTFNFfQpkZl91bmRlcjUgPC0gV0RJKGluZGljYXRvciA9IGModW5kZXI1ID0gIlNILkRZTi5NT1JUIikpCmBgYAoKYGBge3IgZXZhbCA9IEZBTFNFfQp3cml0ZV9jc3YoZGZfdW5kZXI1LCAiZGF0YS91bmRlcjUuY3N2IikKYGBgCgpgYGB7cn0KZGZfdW5kZXI1IDwtIHJlYWRfY3N2KCJkYXRhL3VuZGVyNS5jc3YiKQpgYGAKCiMjIyDjg4fjg7zjgr/jga7norroqo0KCmBgYHtyfQpkZl91bmRlcjUKYGBgCgpgYGB7cn0Kc3RyKGRmX3VuZGVyNSkKYGBgCgpgYGB7cn0KUkVHSU9OIDwtIGMoIjFBIiwgIjFXIiwgIjRFIiwgIjdFIiwgIjhTIiwgIkI4IiwgIkVVIiwgIkYxIiwgIk9FIiwgIlMxIiwgCiJTMiIsICJTMyIsICJTNCIsICJUMiIsICJUMyIsICJUNCIsICJUNSIsICJUNiIsICJUNyIsICJWMSIsICJWMiIsIAoiVjMiLCAiVjQiLCAiWEMiLCAiWEQiLCAiWEUiLCAiWEYiLCAiWEciLCAiWEgiLCAiWEkiLCAiWEoiLCAiWEwiLCAKIlhNIiwgIlhOIiwgIlhPIiwgIlhQIiwgIlhRIiwgIlhUIiwgIlhVIiwgIlhZIiwgIlo0IiwgIlo3IiwgIlpGIiwgCiJaRyIsICJaSCIsICJaSSIsICJaSiIsICJaUSIsICJaVCIpCmBgYAoKYGBge3J9CmRmX3VuZGVyNSB8PiBmaWx0ZXIoaXNvMmMgJWluJSBSRUdJT04pIHw+IGRpc3RpbmN0KGNvdW50cnksIGlzbzJjKQpgYGAKCmBgYHtyfQpkZl91bmRlcjUgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiBkaXN0aW5jdChjb3VudHJ5LCBpc28yYykKYGBgCgojIyMg5YiG5p6Q44GZ44KL5Zu944Gu44Oq44K544OICgojIyMjICoq5Y2X6YOo44Ki44OV44Oq44Kr6Zai56iO5ZCM55ufKiogVGhlIFNvdXRoZXJuIEFmcmljYW4gQ3VzdG9tcyBVbmlvbiAoU0FDVSkKCmBgYHtyfQpTT1VUSF9BRlJJQ0FfRklWRSA8LSBjKCJTb3V0aCBBZnJpY2EiLCAiTmFtaWJpYSIsICJFc3dhdGluaSIsICJCb3Rzd2FuYSIsICJMZXNvdGhvIikKYGBgCgojIyMjIOODqeODhuODs+OCouODoeODquOCq+OBp+OCuOODi+aMh+aVsOOBjOWkp+OBjeOBhO+8lOOCq+WbvQoKYGBge3J9CkNIT1NFTl9DT1VOVFJJRVMgPC0gYygiU3VyaW5hbWUiLCAiQmVsaXplIiwgIkJyYXppbCIsICJDb2xvbWJpYSIpCmBgYAoKIyMg5YiG5p6QCgojIyMgMS4g5ZCE5bm05q+O44Gu44OH44O844K/44Gu5pWw44Gu5qOS44Kw44Op44OVCgpgYGB7cn0KZGZfdW5kZXI1IHw+IGRyb3BfbmEodW5kZXI1KSB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyKSkgKyBnZW9tX2JhcigpCmBgYAoKIyMg6KaW6Kaa5YyWCgojIyMgMi4g5LqU5q2z5pyq5rqA5q275Lqh546H77yIMTAwMOS6uuOBguOBn+OCiu+8iQoKYGBge3J9CmRmX3VuZGVyNSB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PiAKICBkcm9wX25hKHVuZGVyNSkgfD4gYXJyYW5nZShkZXNjKHllYXIpKQpgYGAKCiMjIyAzLiDntYzlubTlpInljJYKCiMjIyMgYS4g5pel5pysCgpgYGB7cn0KZGZfdW5kZXI1IHw+IGZpbHRlcihjb3VudHJ5ID09ICJKYXBhbiIpIHw+IGRyb3BfbmEodW5kZXI1KSB8PgogIGdncGxvdChhZXMoeWVhciwgdW5kZXI1KSkgKyBnZW9tX2xpbmUoKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCi0gICDntpnntprnmoTjgavmuJvlsJHjgZfjgabjgYTjgovjgIIKCi0gICAxOTYw5bm044GU44KN44GvNDAlIOOBqOOBhOOBhuOBk+OBqOOBr+OAgTE5NTDlubTjgZTjgo3jga/jgIE1MCUg44GQ44KJ44GE44Gg44Gj44Gf44Gu44Gg44KN44GG44GL44CCCgojIyMjIGIuIOWNl+mDqOOCouODleODquOCq+mWoueojuWQjOebnwoKYGBge3J9CmRmX3VuZGVyNSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSB8PiBkcm9wX25hKHVuZGVyNSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHVuZGVyNSkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkKYGBgCgoqKuWPguiAg++8muW5s+Wdh+eahOOBquWApOOCkuabsue3muOBp+ihqOOBmeOBk+OBqOOCguWPr+iDveOBp+OBmeOAgmxvZXNzIOOCkuS9v+OBhuOBqOa7keOCieOBi+OBquabsue3muOBp+i/keS8vOOBl+OBpuOBj+OCjOOBvuOBmeOAgioqCgpgYGB7cn0KZGZfdW5kZXI1IHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIHw+IGRyb3BfbmEodW5kZXI1KSB8PgogIGdncGxvdChhZXMoeWVhciwgdW5kZXI1KSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKSArCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9ICd5fngnLCBtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCi0gICAyMDAw5bm044GZ44GO44Gr5LiK5piH44GX44Gm44GE44KL44GM44CB44Gd44KM5Lul5aSW44Gv44CB5rib5bCR44GX44Gm44GE44KL44CCCi0gICDntJvkuonjgaDjgo3jgYbjgYvjgIIKCiMjIyMgYy4g44Op44OG44Oz44Ki44Oh44Oq44Kr77yU44Kr5Zu9CgpgYGB7cn0KZGZfdW5kZXI1IHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgQ0hPU0VOX0NPVU5UUklFUykgfD4gZHJvcF9uYSh1bmRlcjUpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCB1bmRlcjUpKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpCmBgYAoKKirlj4LogIPvvJrlubPlnYfnmoTjgarlgKTjgpLmm7Lnt5rjgafooajjgZnjgZPjgajjgoLlj6/og73jgafjgZnjgIJsb2VzcyDjgpLkvb/jgYbjgajmu5HjgonjgYvjgarmm7Lnt5rjgafov5HkvLzjgZfjgabjgY/jgozjgb7jgZnjgIIqKgoKYGBge3J9CmRmX3VuZGVyNSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIENIT1NFTl9DT1VOVFJJRVMpIHw+IGRyb3BfbmEodW5kZXI1KSB8PgogIGdncGxvdChhZXMoeWVhciwgdW5kZXI1KSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKSArCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9ICd5fngnLCBtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFKQpgYGAKCiMjIyDliIbluIMKCuODh+ODvOOCv+OBruaVsOOBi+OCieOAgeOBvuOBmuOBr+OAgTIwMjDlubTjgavjgaTjgYTjgabopovjgabjgb/jgovjgIIKCmBgYHtyfQpkZl91bmRlcjUgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKCEoY291bnRyeSAlaW4lIFJFR0lPTikpfD4KICBkcm9wX25hKHVuZGVyNSkgfD4KICBnZ3Bsb3QoYWVzKHVuZGVyNSkpICsgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxMCkKYGBgCgoqKuWPguiAg++8mioqU0FDVSDjga7vvJXjgqvlm73jga7lgKTjgpLnuKbnt5rjgafmm7jjgY3ovrzjgoDjgavjga/kuIvjga7jgojjgYbjgavjgZfjgb7jgZnjgIIKCmBgYHtyfQpkZl91bmRlcjUgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgCmBgYAoKKirlj4LogIPvvJrml6XmnKzjgagqKlNBQ1Ug44Gu77yV44Kr5Zu944Gu5YCk44KS57im57ea44Gn5pu444GN6L6844KA44Gr44Gv5LiL44Gu44KI44GG44Gr44GX44G+44GZ44CCCgpgYGB7cn0KSlAgPC0gMi40ClNBRiA8LSBkZl91bmRlcjUgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gcHVsbCh1bmRlcjUpCmRmX3VuZGVyNSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoIShjb3VudHJ5ICVpbiUgUkVHSU9OKSl8PgogIGRyb3BfbmEodW5kZXI1KSB8PgogIGdncGxvdCgpICsgZ2VvbV9oaXN0b2dyYW0oYWVzKHVuZGVyNSksIGJpbndpZHRoID0gMTApICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBTQUYsIGNvbCA9ICJyZWQiKSArIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IEpQLCBjb2wgPSAiYmx1ZSIpICtsYWJzKHRpdGxlID0gIuS6lOats+acqua6gOOBruatu+S6oeeOh++8iDEwMDDkurrjgYLjgZ/jgorvvIkiLCBzdWJ0aXRsZSA9ICLml6XmnKzvvJrpnZLjgIFTQUNV77ya6LWkIikKYGBgCgojIyMg44OH44O844K/44GM5Y2B5YiG44GC44KL5pyA6L+R44Gu5bm044Gu5YCk44GuMTDjgqvlm73jga7lgKTjga7mo5LjgrDjg6njg5UKCiMjIyMgYS4g5YCk44GM5aSn44GN44GE5pa544GL44KJCgpgYGB7cn0KZGZfdW5kZXI1IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGRyb3BfbmEodW5kZXI1KSB8PiAKICBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpfD4KICBhcnJhbmdlKGRlc2ModW5kZXI1KSkgfD4gaGVhZCgxMCkgfD4gCiAgZ2dwbG90KGFlcyhmY3RfcmVvcmRlcihjb3VudHJ5LCB1bmRlcjUpLCB1bmRlcjUpKSArIGdlb21fY29sKCkgKyAKICBjb29yZF9mbGlwKCkgKyBsYWJzKHRpdGxlID0gIuS6lOats+acqua6gOOBruatu+S6oeeOh++8iDEwMDDkurrjgYLjgZ/jgorvvIkiLCB4ID0gImNvdW50cnkiKQpgYGAKCiMjIyMgYi4g5YCk44GM5bCP44GV44GE5pa544GL44KJCgpgYGB7cn0KZGZfdW5kZXI1IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGRyb3BfbmEodW5kZXI1KSB8PiAKICBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpfD4KICBhcnJhbmdlKHVuZGVyNSkgfD4gaGVhZCgxMCkgfD4gCiAgZ2dwbG90KGFlcyhmY3RfcmV2KGZjdF9yZW9yZGVyKGNvdW50cnksIHVuZGVyNSkpLCB1bmRlcjUpKSArIGdlb21fY29sKCkgKyAKICBjb29yZF9mbGlwKCkgKyBsYWJzKHRpdGxlID0gIkxvd2VzdCAxMCBDb3VudHJpZXMiLCB5ID0gInVuZGVyIDUgbW9ydGFsaXR5IiwgeCA9ICJjb3VudHJ5IikKYGBgCgojIDYuIOWIneetieS4reetieWtpuagoeWwseWtpueOh++8iOaAp+W3ru+8iQoKIyMg44OH44O844K/CgotICAgU2Nob29sIGVucm9sbG1lbnQsIHByaW1hcnkgYW5kIHNlY29uZGFyeSAoZ3Jvc3MpLCBnZW5kZXIgcGFyaXR5IGluZGV4IChHUEkp77yaU0UuRU5SLlBSU0MuRk0uWlMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0UuRU5SLlBSU0MuRk0uWlMpXQoKIyMjIOODh+ODvOOCv+aDheWgsQoKLSAgIOODh+ODvOOCv+WQje+8mgoKLSAgIOODh+ODvOOCv+OCs+ODvOODie+8mgoKLSAgIOWkieaVsOWQje+8mgoKLSAgIOamguimge+8mgoKIyMjIOODh+ODvOOCv+OBruWPluW+lwoKIyMjIyDmupblgpkKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShXREkpCmBgYAoKV0RJIOODkeODg+OCseODvOOCuOOCkuS9v+OBo+OBpuOAgeebtOaOpeODh+ODvOOCv+OCkuODgOOCpuODs+ODreODvOODieOBl+OAgeWkieaVsOWQjeOCkuOAgWBlZF9leHBgIOOBq+aMh+WumuOAggoKYGBge3IgZXZhbCA9IEZBTFNFfQpkZl9zY2hvb2xfZ3BpIDwtIFdESShpbmRpY2F0b3IgPSBjKHNjaG9vbF9ncGkgPSAiU0UuRU5SLlBSU0MuRk0uWlMiKSkKYGBgCgpgYGB7ciBldmFsID0gRkFMU0V9CndyaXRlX2NzdihkZl9zY2hvb2xfZ3BpLCAiZGF0YS9zY2hvb2xfZ3BpLmNzdiIpCmBgYAoKYGBge3J9CmRmX3NjaG9vbF9ncGkgPC0gcmVhZF9jc3YoImRhdGEvc2Nob29sX2dwaS5jc3YiKQpgYGAKCiMjIyDjg4fjg7zjgr/jga7norroqo0KCmBgYHtyfQpkZl9zY2hvb2xfZ3BpCmBgYAoKYGBge3J9CnN0cihkZl9zY2hvb2xfZ3BpKQpgYGAKCmBgYHtyfQpSRUdJT04gPC0gYygiMUEiLCAiMVciLCAiNEUiLCAiN0UiLCAiOFMiLCAiQjgiLCAiRVUiLCAiRjEiLCAiT0UiLCAiUzEiLCAKIlMyIiwgIlMzIiwgIlM0IiwgIlQyIiwgIlQzIiwgIlQ0IiwgIlQ1IiwgIlQ2IiwgIlQ3IiwgIlYxIiwgIlYyIiwgCiJWMyIsICJWNCIsICJYQyIsICJYRCIsICJYRSIsICJYRiIsICJYRyIsICJYSCIsICJYSSIsICJYSiIsICJYTCIsIAoiWE0iLCAiWE4iLCAiWE8iLCAiWFAiLCAiWFEiLCAiWFQiLCAiWFUiLCAiWFkiLCAiWjQiLCAiWjciLCAiWkYiLCAKIlpHIiwgIlpIIiwgIlpJIiwgIlpKIiwgIlpRIiwgIlpUIikKYGBgCgpgYGB7cn0KZGZfc2Nob29sX2dwaSB8PiBmaWx0ZXIoaXNvMmMgJWluJSBSRUdJT04pIHw+IGRpc3RpbmN0KGNvdW50cnksIGlzbzJjKQpgYGAKCmBgYHtyfQpkZl9zY2hvb2xfZ3BpIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZGlzdGluY3QoY291bnRyeSwgaXNvMmMpCmBgYAoKIyMjIOWIhuaekOOBmeOCi+WbveOBruODquOCueODiAoKIyMjIyAqKuWNl+mDqOOCouODleODquOCq+mWoueojuWQjOebnyoqIFRoZSBTb3V0aGVybiBBZnJpY2FuIEN1c3RvbXMgVW5pb24gKFNBQ1UpCgpgYGB7cn0KU09VVEhfQUZSSUNBX0ZJVkUgPC0gYygiU291dGggQWZyaWNhIiwgIk5hbWliaWEiLCAiRXN3YXRpbmkiLCAiQm90c3dhbmEiLCAiTGVzb3RobyIpCmBgYAoKIyMjIyDjg6njg4bjg7PjgqLjg6Hjg6rjgqvjgafjgrjjg4vmjIfmlbDjgYzlpKfjgY3jgYTvvJTjgqvlm70KCmBgYHtyfQpDSE9TRU5fQ09VTlRSSUVTIDwtIGMoIlN1cmluYW1lIiwgIkJlbGl6ZSIsICJCcmF6aWwiLCAiQ29sb21iaWEiKQpgYGAKCiMjIOWIhuaekAoKIyMjIDEuIOWQhOW5tOavjuOBruODh+ODvOOCv+OBruaVsOOBruajkuOCsOODqeODlQoKYGBge3J9CmRmX3NjaG9vbF9ncGkgfD4gZHJvcF9uYShzY2hvb2xfZ3BpKSB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyKSkgKyBnZW9tX2JhcigpCmBgYAoKIyMg6KaW6Kaa5YyWCgojIyMgMi4g5pel5pys44Gu5Yid562J5Lit562J5a2m5qCh5bCx5a2m546H44Gr44GK44GR44KLIEdQSQoKYGBge3J9CmRmX3NjaG9vbF9ncGkgfD4gZmlsdGVyKGNvdW50cnkgPT0gIkphcGFuIikgfD4gCiAgZHJvcF9uYShzY2hvb2xfZ3BpKSB8PiBhcnJhbmdlKGRlc2MoeWVhcikpCmBgYAoKIyMjIDMuIOe1jOW5tOWkieWMlgoKIyMjIyBhLiDml6XmnKwKCmBgYHtyfQpkZl9zY2hvb2xfZ3BpIHw+IGZpbHRlcihjb3VudHJ5ID09ICJKYXBhbiIpIHw+IGRyb3BfbmEoc2Nob29sX2dwaSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHNjaG9vbF9ncGkpKSArIGdlb21fbGluZSgpCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSAgIDE5OTXlubTjgZTjgo3jgb7jgafjga/mj7rjgonjgY7jgYzjgYLjgovjgILjgZ3jga7jgYLjgajjga/jgIHkuIvpmY3jgIIKCi0gICDlt67jgYzlsI/jgZXjgYTjga7jgafjgIHjgYLjgb7jgorjgIHmsJfjgavjgZnjgovjga7jga/pganliIfjgafjga/jgarjgYTjgYvjgoLjgZfjgozjgarjgYTjgIIKCiMjIyMgYi4g5Y2X6YOo44Ki44OV44Oq44Kr6Zai56iO5ZCM55ufCgpgYGB7cn0KZGZfc2Nob29sX2dwaSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSB8PiAKICBkcm9wX25hKHNjaG9vbF9ncGkpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBzY2hvb2xfZ3BpKSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKQpgYGAKCioq5Y+C6ICD77ya5bmz5Z2H55qE44Gq5YCk44KS5puy57ea44Gn6KGo44GZ44GT44Go44KC5Y+v6IO944Gn44GZ44CCbG9lc3Mg44KS5L2/44GG44Go5ruR44KJ44GL44Gq5puy57ea44Gn6L+R5Ly844GX44Gm44GP44KM44G+44GZ44CCKioKCmBgYHtyfQpkZl9zY2hvb2xfZ3BpIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIHw+IGRyb3BfbmEoc2Nob29sX2dwaSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHNjaG9vbF9ncGkpKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpICsKICBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3l+eCcsIG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UpCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSAgIOOChuOCi+OChOOBi+OBq+a4m+WwkeOAgjEuMCDjgavov5HjgaXjgYTjgabjgYTjgovjgIIKCiMjIyMgYy4g44Op44OG44Oz44Ki44Oh44Oq44Kr77yU44Kr5Zu9CgpgYGB7cn0KZGZfc2Nob29sX2dwaSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIENIT1NFTl9DT1VOVFJJRVMpIHw+IGRyb3BfbmEoc2Nob29sX2dwaSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHNjaG9vbF9ncGkpKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpCmBgYAoKKirlj4LogIPvvJrlubPlnYfnmoTjgarlgKTjgpLmm7Lnt5rjgafooajjgZnjgZPjgajjgoLlj6/og73jgafjgZnjgIJsb2VzcyDjgpLkvb/jgYbjgajmu5HjgonjgYvjgarmm7Lnt5rjgafov5HkvLzjgZfjgabjgY/jgozjgb7jgZnjgIIqKgoKYGBge3J9CmRmX3NjaG9vbF9ncGkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBDSE9TRU5fQ09VTlRSSUVTKSB8PiBkcm9wX25hKHNjaG9vbF9ncGkpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBzY2hvb2xfZ3BpKSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKSArCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9ICd5fngnLCBtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFKQpgYGAKCiMjIyDliIbluIMKCuODh+ODvOOCv+OBruaVsOOBi+OCieOAgTIwMjDlubTjga7jg4fjg7zjgr/jga/lsJHjgarjgYTjga7jgafjgIEyMDE55bm044Gr44Gk44GE44Gm6KaL44Gm44G/44KL44CCCgpgYGB7cn0KZGZfc2Nob29sX2dwaSB8PiBmaWx0ZXIoeWVhciA9PSAyMDE5KSB8PiBmaWx0ZXIoIShjb3VudHJ5ICVpbiUgUkVHSU9OKSl8PgogIGRyb3BfbmEoc2Nob29sX2dwaSkgfD4KICBnZ3Bsb3QoYWVzKHNjaG9vbF9ncGkpKSArIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC4wMikKYGBgCgoqKuWPguiAg++8mioqU0FDVSDjga7vvJXjgqvlm73jga7lgKTjgpLnuKbnt5rjgafmm7jjgY3ovrzjgoDjgavjga/kuIvjga7jgojjgYbjgavjgZfjgb7jgZnjgIIKCmBgYHtyfQpkZl9zY2hvb2xfZ3BpIHw+IGZpbHRlcih5ZWFyID09IDIwMTkpIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIApgYGAKCioq5Y+C6ICD77ya5pel5pys44GoKipTQUNVIOOBru+8leOCq+WbveOBruWApOOCkue4pue3muOBp+abuOOBjei+vOOCgOOBq+OBr+S4i+OBruOCiOOBhuOBq+OBl+OBvuOBmeOAggoKYGBge3J9CkpQIDwtIDEuMDAzNDEgIyBubyByZWNlbnQgZGF0YSBhZnRlciAyMDE5ClNBRiA8LSBkZl9zY2hvb2xfZ3BpIHw+IGZpbHRlcih5ZWFyID09IDIwMTkpIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIHw+IHB1bGwoc2Nob29sX2dwaSkKZGZfc2Nob29sX2dwaSB8PiBmaWx0ZXIoeWVhciA9PSAyMDE5KSB8PiBmaWx0ZXIoIShjb3VudHJ5ICVpbiUgUkVHSU9OKSl8PgogIGRyb3BfbmEoc2Nob29sX2dwaSkgfD4KICBnZ3Bsb3QoKSArIGdlb21faGlzdG9ncmFtKGFlcyhzY2hvb2xfZ3BpKSwgYmlud2lkdGggPSAwLjAyKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gU0FGLCBjb2wgPSAicmVkIikgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBKUCwgY29sID0gImJsdWUiKSArbGFicyh0aXRsZSA9ICIyMDE55bm044Gu5Yid562J5Lit562J5a2m5qCh5bCx5a2m546HIEdQSSIsIHN1YnRpdGxlID0gIuaXpeacrO+8mumdkuOAgVNBQ1XvvJrotaQiKQpgYGAKCiMjIyDjg4fjg7zjgr/jgYzljYHliIbjgYLjgovmnIDov5Hjga7lubTjga7lgKTjga4xMOOCq+WbveOBruWApOOBruajkuOCsOODqeODlQoKIyMjIyBhLiDlgKTjgYzlpKfjgY3jgYTmlrnjgYvjgokKCmBgYHtyfQpkZl9zY2hvb2xfZ3BpIHw+IGZpbHRlcih5ZWFyID09IDIwMTkpIHw+IGRyb3BfbmEoc2Nob29sX2dwaSkgfD4gCiAgZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKXw+CiAgYXJyYW5nZShkZXNjKHNjaG9vbF9ncGkpKSB8PiBoZWFkKDEwKSB8PiAKICBnZ3Bsb3QoYWVzKGZjdF9yZW9yZGVyKGNvdW50cnksIHNjaG9vbF9ncGkpLCBzY2hvb2xfZ3BpKSkgKyBnZW9tX2NvbCgpICsgCiAgY29vcmRfZmxpcCgpICsgbGFicyh0aXRsZSA9ICJUb3AgMTAgQ291bnRyaWVzIiwgeCA9ICJjb3VudHJ5IiwgeSA9ICJwcmltYXJ5IGFuZCBzZWNvbmRhcnkgZW5yb2xsbWVudCwgR1BJIikKYGBgCgojIyMjIGIuIOWApOOBjOWwj+OBleOBhOaWueOBi+OCiQoKYGBge3J9CmRmX3NjaG9vbF9ncGkgfD4gZmlsdGVyKHllYXIgPT0gMjAxOSkgfD4gZHJvcF9uYShzY2hvb2xfZ3BpKSB8PiAKICBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpfD4KICBhcnJhbmdlKHNjaG9vbF9ncGkpIHw+IGhlYWQoMTApIHw+IAogIGdncGxvdChhZXMoZmN0X3JldihmY3RfcmVvcmRlcihjb3VudHJ5LCBzY2hvb2xfZ3BpKSksIHNjaG9vbF9ncGkpKSArIGdlb21fY29sKCkgKyAKICBjb29yZF9mbGlwKCkgKyBsYWJzKHRpdGxlID0gIkxvd2VzdCAxMCBDb3VudHJpZXMiLCB4ID0gImNvdW50cnkiLCB5ID0gInByaW1hcnkgYW5kIHNlY29uZGFyeSBlbnJvbGxtZW50LCBHUEkiKQpgYGAKCiMgNy4g5aWz5oCn5bCx5Yq0546HCgojIyDjg4fjg7zjgr8KCi0gICBSYXRpbyBvZiBmZW1hbGUgdG8gbWFsZSBsYWJvciBmb3JjZSBwYXJ0aWNpcGF0aW9uIHJhdGUgKCUpIChtb2RlbGVkIElMTyBlc3RpbWF0ZSnvvJpTTC5UTEYuQ0FDVC5GTS5aUyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TTC5UTEYuQ0FDVC5GTS5aUyldCgojIyMg44OH44O844K/5oOF5aCxCgotICAg44OH44O844K/5ZCN77yaCgotICAg44OH44O844K/44Kz44O844OJ77yaCgotICAg5aSJ5pWw5ZCN77yaCgotICAg5qaC6KaB77ya44OH44O844K/44Gu5Y+W5b6XCgojIyMjIOa6luWCmQoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KFdESSkKYGBgCgpXREkg44OR44OD44Kx44O844K444KS5L2/44Gj44Gm44CB55u05o6l44OH44O844K/44KS44OA44Km44Oz44Ot44O844OJ44GX44CB5aSJ5pWw5ZCN44KS44CBYGVkX2V4cGAg44Gr5oyH5a6a44CCCgpgYGB7ciBldmFsID0gRkFMU0V9CmRmX2pvYl9ncGkgPC0gV0RJKGluZGljYXRvciA9IGMoam9iX2dwaSA9ICJTTC5UTEYuQ0FDVC5GTS5aUyIpKQpgYGAKCmBgYHtyIGV2YWwgPSBGQUxTRX0Kd3JpdGVfY3N2KGRmX2pvYl9ncGksICJkYXRhL2pvYl9ncGkuY3N2IikKYGBgCgpgYGB7cn0KZGZfam9iX2dwaSA8LSByZWFkX2NzdigiZGF0YS9qb2JfZ3BpLmNzdiIpCmBgYAoKIyMjIOODh+ODvOOCv+OBrueiuuiqjQoKYGBge3J9CmRmX2pvYl9ncGkKYGBgCgpgYGB7cn0Kc3RyKGRmX2pvYl9ncGkpCmBgYAoKYGBge3J9ClJFR0lPTiA8LSBjKCIxQSIsICIxVyIsICI0RSIsICI3RSIsICI4UyIsICJCOCIsICJFVSIsICJGMSIsICJPRSIsICJTMSIsIAoiUzIiLCAiUzMiLCAiUzQiLCAiVDIiLCAiVDMiLCAiVDQiLCAiVDUiLCAiVDYiLCAiVDciLCAiVjEiLCAiVjIiLCAKIlYzIiwgIlY0IiwgIlhDIiwgIlhEIiwgIlhFIiwgIlhGIiwgIlhHIiwgIlhIIiwgIlhJIiwgIlhKIiwgIlhMIiwgCiJYTSIsICJYTiIsICJYTyIsICJYUCIsICJYUSIsICJYVCIsICJYVSIsICJYWSIsICJaNCIsICJaNyIsICJaRiIsIAoiWkciLCAiWkgiLCAiWkkiLCAiWkoiLCAiWlEiLCAiWlQiKQpgYGAKCmBgYHtyfQpkZl9qb2JfZ3BpIHw+IGZpbHRlcihpc28yYyAlaW4lIFJFR0lPTikgfD4gZGlzdGluY3QoY291bnRyeSwgaXNvMmMpCmBgYAoKYGBge3J9CmRmX2pvYl9ncGkgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiBkaXN0aW5jdChjb3VudHJ5LCBpc28yYykKYGBgCgojIyMg5YiG5p6Q44GZ44KL5Zu944Gu44Oq44K544OICgojIyMjICoq5Y2X6YOo44Ki44OV44Oq44Kr6Zai56iO5ZCM55ufKiogVGhlIFNvdXRoZXJuIEFmcmljYW4gQ3VzdG9tcyBVbmlvbiAoU0FDVSkKCmBgYHtyfQpTT1VUSF9BRlJJQ0FfRklWRSA8LSBjKCJTb3V0aCBBZnJpY2EiLCAiTmFtaWJpYSIsICJFc3dhdGluaSIsICJCb3Rzd2FuYSIsICJMZXNvdGhvIikKYGBgCgojIyMjIOODqeODhuODs+OCouODoeODquOCq+OBp+OCuOODi+aMh+aVsOOBjOWkp+OBjeOBhO+8lOOCq+WbvQoKYGBge3J9CkNIT1NFTl9DT1VOVFJJRVMgPC0gYygiU3VyaW5hbWUiLCAiQmVsaXplIiwgIkJyYXppbCIsICJDb2xvbWJpYSIpCmBgYAoKIyMg5YiG5p6QCgojIyMgMS4g5ZCE5bm05q+O44Gu44OH44O844K/44Gu5pWw44Gu5qOS44Kw44Op44OVCgpgYGB7cn0KZGZfam9iX2dwaSB8PiBkcm9wX25hKGpvYl9ncGkpIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIpKSArIGdlb21fYmFyKCkKYGBgCgojIyDoppbopprljJYKCiMjIyAyLiDml6XmnKzjga7lpbPmgKflsLHlirTnjocKCmBgYHtyfQpkZl9qb2JfZ3BpIHw+IGZpbHRlcihjb3VudHJ5ID09ICJKYXBhbiIpIHw+IAogIGRyb3BfbmEoam9iX2dwaSkgfD4gYXJyYW5nZShkZXNjKHllYXIpKQpgYGAKCiMjIyAzLiDntYzlubTlpInljJYKCiMjIyMgYS4g5pel5pysCgpgYGB7cn0KZGZfam9iX2dwaSB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PiBkcm9wX25hKGpvYl9ncGkpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBqb2JfZ3BpKSkgKyBnZW9tX2xpbmUoKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCi0gICAyMDAw5bm044GU44KN44GL44KJ44Gv5LiK5piH44GX44Gm44GE44KL44CC44Gp44KT44Gq5pS/562W5aSJ5pu044GM44GC44Gj44Gf44Gu44Gg44KN44GG44GL44CCCgotICAg44GT44Gu44G+44G+44CB5LiK5piH44GZ44KL44Go44CBMjA0MOW5tOOBlOOCjeOBq+OBr+OAgTkw44KS6LaF44GI44CBMTAw44Gr6L+R44Gl44GP44CC44Gd44KM44Gn44CB5ZWP6aGM44Gv6Kej5rG644GX44Gf44Go6KiA44GI44KL44Gu44Gg44KN44GG44GL44CCCgojIyMjIGIuIOWNl+mDqOOCouODleODquOCq+mWoueojuWQjOebnwoKYGBge3J9CmRmX2pvYl9ncGkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gZHJvcF9uYShqb2JfZ3BpKSB8PgogIGdncGxvdChhZXMoeWVhciwgam9iX2dwaSkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkKYGBgCgoqKuWPguiAg++8muW5s+Wdh+eahOOBquWApOOCkuabsue3muOBp+ihqOOBmeOBk+OBqOOCguWPr+iDveOBp+OBmeOAgmxvZXNzIOOCkuS9v+OBhuOBqOa7keOCieOBi+OBquabsue3muOBp+i/keS8vOOBl+OBpuOBj+OCjOOBvuOBmeOAgioqCgpgYGB7cn0KZGZfam9iX2dwaSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSB8PiBkcm9wX25hKGpvYl9ncGkpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBqb2JfZ3BpKSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKSArCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9ICd5fngnLCBtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCi0gICDlhajkvZPnmoTjgavjga/kuIrmmIfjgZfjgabjgYTjgovjgIIKCiMjIyMgYy4g44Op44OG44Oz44Ki44Oh44Oq44Kr77yU44Kr5Zu9CgpgYGB7cn0KZGZfam9iX2dwaSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIENIT1NFTl9DT1VOVFJJRVMpIHw+IGRyb3BfbmEoam9iX2dwaSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIGpvYl9ncGkpKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpCmBgYAoKKirlj4LogIPvvJrlubPlnYfnmoTjgarlgKTjgpLmm7Lnt5rjgafooajjgZnjgZPjgajjgoLlj6/og73jgafjgZnjgIJsb2VzcyDjgpLkvb/jgYbjgajmu5HjgonjgYvjgarmm7Lnt5rjgafov5HkvLzjgZfjgabjgY/jgozjgb7jgZnjgIIqKgoKYGBge3J9CmRmX2pvYl9ncGkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBDSE9TRU5fQ09VTlRSSUVTKSB8PiBkcm9wX25hKGpvYl9ncGkpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBqb2JfZ3BpKSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKSArCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9ICd5fngnLCBtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFKQpgYGAKCiMjIyDliIbluIMKCuODh+ODvOOCv+OBruaVsOOBi+OCieOAgeOBvuOBmuOBr+OAgTIwMjDlubTjgavjgaTjgYTjgabopovjgabjgb/jgovjgIIKCmBgYHtyfQpkZl9qb2JfZ3BpIHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcighKGNvdW50cnkgJWluJSBSRUdJT04pKXw+CiAgZHJvcF9uYShqb2JfZ3BpKSB8PgogIGdncGxvdChhZXMoam9iX2dwaSkpICsgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxMCkKYGBgCgoqKuWPguiAg++8mioqU0FDVSDjga7vvJXjgqvlm73jga7lgKTjgpLnuKbnt5rjgafmm7jjgY3ovrzjgoDjgavjga/kuIvjga7jgojjgYbjgavjgZfjgb7jgZnjgIIKCmBgYHtyfQpkZl9qb2JfZ3BpIHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIApgYGAKCioq5Y+C6ICD77ya5pel5pys44GoKipTQUNVIOOBru+8leOCq+WbveOBruWApOOCkue4pue3muOBp+abuOOBjei+vOOCgOOBq+OBr+S4i+OBruOCiOOBhuOBq+OBl+OBvuOBmeOAggoKYGBge3J9CkpQIDwtIDc0LjUxMDI3ClNBRiA8LSBkZl9qb2JfZ3BpIHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIHw+IHB1bGwoam9iX2dwaSkKZGZfam9iX2dwaSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoIShjb3VudHJ5ICVpbiUgUkVHSU9OKSl8PgogIGRyb3BfbmEoam9iX2dwaSkgfD4KICBnZ3Bsb3QoKSArIGdlb21faGlzdG9ncmFtKGFlcyhqb2JfZ3BpKSwgYmlud2lkdGggPSAxMCkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IFNBRiwgY29sID0gInJlZCIpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gSlAsIGNvbCA9ICJibHVlIikgK2xhYnModGl0bGUgPSAi5aWz5oCn44Gu5bCx5Yq0546HIiwgc3VidGl0bGUgPSAi5pel5pys77ya6Z2S44CBU0FDVe+8mui1pCIpCmBgYAoKIyMjIOODh+ODvOOCv+OBjOWNgeWIhuOBguOCi+acgOi/keOBruW5tOOBruWApOOBrjEw44Kr5Zu944Gu5YCk44Gu5qOS44Kw44Op44OVCgojIyMjIGEuIOWApOOBjOWkp+OBjeOBhOaWueOBi+OCiQoKYGBge3J9CmRmX2pvYl9ncGkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZHJvcF9uYShqb2JfZ3BpKSB8PiAKICBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpfD4KICBhcnJhbmdlKGRlc2Moam9iX2dwaSkpIHw+IGhlYWQoMTApIHw+IAogIGdncGxvdChhZXMoZmN0X3Jlb3JkZXIoY291bnRyeSwgam9iX2dwaSksIGpvYl9ncGkpKSArIGdlb21fY29sKCkgKyAKICBjb29yZF9mbGlwKCkgKyBsYWJzKHRpdGxlID0gIlRvcCAxMCBDb3VudHJpZXMiLCB4ID0gImNvdW50cnkiLCB5ID0gImxhYm9yIGZvcmNlIHBhcnRpY2lwYXRpb24gcmF0ZSBvZiAiKQpgYGAKCiMjIyMgYi4g5YCk44GM5bCP44GV44GE5pa544GL44KJCgpgYGB7cn0KZGZfam9iX2dwaSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBkcm9wX25hKGpvYl9ncGkpIHw+IAogIGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSl8PgogIGFycmFuZ2Uoam9iX2dwaSkgfD4gaGVhZCgxMCkgfD4gCiAgZ2dwbG90KGFlcyhmY3RfcmV2KGZjdF9yZW9yZGVyKGNvdW50cnksIGpvYl9ncGkpKSwgam9iX2dwaSkpICsgZ2VvbV9jb2woKSArIAogIGNvb3JkX2ZsaXAoKSArIGxhYnModGl0bGUgPSAiTG93ZXN0IDEwIENvdW50cmllcyIsIHggPSAiY291bnRyeSIsIHkgPSAibGFib3IgZm9yY2UgcGFydGljaXBhdGlvbiByYXRlIikKYGBgCgojIDguIOWls+aAp+WksealreeOhwoKIyMg44OH44O844K/CgotICAgVW5lbXBsb3ltZW50LCBmZW1hbGUgKCUgb2YgZmVtYWxlIGxhYm9yIGZvcmNlKSAobW9kZWxlZCBJTE8gZXN0aW1hdGUp77yaU0wuVUVNLlRPVEwuRkUuWlMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0wuVUVNLlRPVEwuRkUuWlMpXQoKIyMjIOODh+ODvOOCv+aDheWgsQoKLSAgIOODh+ODvOOCv+WQje+8mgoKLSAgIOODh+ODvOOCv+OCs+ODvOODie+8mgoKLSAgIOWkieaVsOWQje+8mgoKLSAgIOamguimge+8mgoKIyMjIOODh+ODvOOCv+OBruWPluW+lwoKIyMjIyDmupblgpkKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShXREkpCmBgYAoKV0RJIOODkeODg+OCseODvOOCuOOCkuS9v+OBo+OBpuOAgeebtOaOpeODh+ODvOOCv+OCkuODgOOCpuODs+ODreODvOODieOBl+OAgeWkieaVsOWQjeOCkuOAgWBlZF9leHBgIOOBq+aMh+WumuOAggoKYGBge3IgZXZhbCA9IEZBTFNFfQpkZl9mZW1hbGVfdW5lbXBsb3kgPC0gV0RJKGluZGljYXRvciA9IGMoZmVtYWxlX3VuZW1wbG95ID0gIlNMLlVFTS5UT1RMLkZFLlpTIikpCmBgYAoKYGBge3IgZXZhbCA9IEZBTFNFfQp3cml0ZV9jc3YoZGZfZmVtYWxlX3VuZW1wbG95LCAiZGF0YS9mZW1hbGVfdW5lbXBsb3kuY3N2IikKYGBgCgpgYGB7cn0KZGZfZmVtYWxlX3VuZW1wbG95IDwtIHJlYWRfY3N2KCJkYXRhL2ZlbWFsZV91bmVtcGxveS5jc3YiKQpgYGAKCiMjIyDjg4fjg7zjgr/jga7norroqo0KCmBgYHtyfQpkZl9mZW1hbGVfdW5lbXBsb3kKYGBgCgpgYGB7cn0Kc3RyKGRmX2ZlbWFsZV91bmVtcGxveSkKYGBgCgpgYGB7cn0KUkVHSU9OIDwtIGMoIjFBIiwgIjFXIiwgIjRFIiwgIjdFIiwgIjhTIiwgIkI4IiwgIkVVIiwgIkYxIiwgIk9FIiwgIlMxIiwgCiJTMiIsICJTMyIsICJTNCIsICJUMiIsICJUMyIsICJUNCIsICJUNSIsICJUNiIsICJUNyIsICJWMSIsICJWMiIsIAoiVjMiLCAiVjQiLCAiWEMiLCAiWEQiLCAiWEUiLCAiWEYiLCAiWEciLCAiWEgiLCAiWEkiLCAiWEoiLCAiWEwiLCAKIlhNIiwgIlhOIiwgIlhPIiwgIlhQIiwgIlhRIiwgIlhUIiwgIlhVIiwgIlhZIiwgIlo0IiwgIlo3IiwgIlpGIiwgCiJaRyIsICJaSCIsICJaSSIsICJaSiIsICJaUSIsICJaVCIpCmBgYAoKYGBge3J9CmRmX2ZlbWFsZV91bmVtcGxveSB8PiBmaWx0ZXIoaXNvMmMgJWluJSBSRUdJT04pIHw+IGRpc3RpbmN0KGNvdW50cnksIGlzbzJjKQpgYGAKCmBgYHtyfQpkZl9mZW1hbGVfdW5lbXBsb3kgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiBkaXN0aW5jdChjb3VudHJ5LCBpc28yYykKYGBgCgojIyMg5YiG5p6Q44GZ44KL5Zu944Gu44Oq44K544OICgojIyMjICoq5Y2X6YOo44Ki44OV44Oq44Kr6Zai56iO5ZCM55ufKiogVGhlIFNvdXRoZXJuIEFmcmljYW4gQ3VzdG9tcyBVbmlvbiAoU0FDVSkKCmBgYHtyfQpTT1VUSF9BRlJJQ0FfRklWRSA8LSBjKCJTb3V0aCBBZnJpY2EiLCAiTmFtaWJpYSIsICJFc3dhdGluaSIsICJCb3Rzd2FuYSIsICJMZXNvdGhvIikKYGBgCgojIyMjIOODqeODhuODs+OCouODoeODquOCq+OBp+OCuOODi+aMh+aVsOOBjOWkp+OBjeOBhO+8lOOCq+WbvQoKYGBge3J9CkNIT1NFTl9DT1VOVFJJRVMgPC0gYygiU3VyaW5hbWUiLCAiQmVsaXplIiwgIkJyYXppbCIsICJDb2xvbWJpYSIpCmBgYAoKIyMg5YiG5p6QCgojIyMgMS4g5ZCE5bm05q+O44Gu44OH44O844K/44Gu5pWw44Gu5qOS44Kw44Op44OVCgpgYGB7cn0KZGZfZmVtYWxlX3VuZW1wbG95IHw+IGRyb3BfbmEoZmVtYWxlX3VuZW1wbG95KSB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyKSkgKyBnZW9tX2JhcigpCmBgYAoKIyMg6KaW6Kaa5YyWCgojIyMgMi4g5pel5pys44Gu5aWz5oCn5aSx5qWt546HCgpgYGB7cn0KZGZfZmVtYWxlX3VuZW1wbG95IHw+IGZpbHRlcihjb3VudHJ5ID09ICJKYXBhbiIpIHw+IAogIGRyb3BfbmEoZmVtYWxlX3VuZW1wbG95KSB8PiBhcnJhbmdlKGRlc2MoeWVhcikpCmBgYAoKIyMjIDMuIOe1jOW5tOWkieWMlgoKIyMjIyBhLiDml6XmnKwKCmBgYHtyfQpkZl9mZW1hbGVfdW5lbXBsb3kgfD4gZmlsdGVyKGNvdW50cnkgPT0gIkphcGFuIikgfD4gZHJvcF9uYShmZW1hbGVfdW5lbXBsb3kpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBmZW1hbGVfdW5lbXBsb3kpKSArIGdlb21fbGluZSgpCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSAgIDIwMDDlubTjgZTjgo3jgYvjgonjgIEyMDEw5bm044GU44KN44G+44Gn6Z2e5bi444Gr6auY44GE5rC05rqW44Gr44Gq44Gj44Gm44GE44KL44CC5L2V44GM5Y6f5Zug44Gq44Gu44Gg44KN44GG44CCCgojIyMjIGIuIOWNl+mDqOOCouODleODquOCq+mWoueojuWQjOebnwoKYGBge3J9CmRmX2ZlbWFsZV91bmVtcGxveSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSB8PiBkcm9wX25hKGZlbWFsZV91bmVtcGxveSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIGZlbWFsZV91bmVtcGxveSkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkKYGBgCgoqKuWPguiAg++8muW5s+Wdh+eahOOBquWApOOCkuabsue3muOBp+ihqOOBmeOBk+OBqOOCguWPr+iDveOBp+OBmeOAgmxvZXNzIOOCkuS9v+OBhuOBqOa7keOCieOBi+OBquabsue3muOBp+i/keS8vOOBl+OBpuOBj+OCjOOBvuOBmeOAgioqCgpgYGB7cn0KZGZfZmVtYWxlX3VuZW1wbG95IHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIHw+IGRyb3BfbmEoZmVtYWxlX3VuZW1wbG95KSB8PgogIGdncGxvdChhZXMoeWVhciwgZmVtYWxlX3VuZW1wbG95KSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKSArCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9ICd5fngnLCBtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCi0gICDlubPlnYfjgafopovjgovjgajjgIEyMyXnqIvluqbjgIIKCiMjIyMgYy4g44Op44OG44Oz44Ki44Oh44Oq44Kr77yU44Kr5Zu9CgpgYGB7cn0KZGZfZmVtYWxlX3VuZW1wbG95IHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgQ0hPU0VOX0NPVU5UUklFUykgfD4gZHJvcF9uYShmZW1hbGVfdW5lbXBsb3kpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBmZW1hbGVfdW5lbXBsb3kpKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpCmBgYAoKKirlj4LogIPvvJrlubPlnYfnmoTjgarlgKTjgpLmm7Lnt5rjgafooajjgZnjgZPjgajjgoLlj6/og73jgafjgZnjgIJsb2VzcyDjgpLkvb/jgYbjgajmu5HjgonjgYvjgarmm7Lnt5rjgafov5HkvLzjgZfjgabjgY/jgozjgb7jgZnjgIIqKgoKYGBge3J9CmRmX2ZlbWFsZV91bmVtcGxveSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIENIT1NFTl9DT1VOVFJJRVMpIHw+IGRyb3BfbmEoZmVtYWxlX3VuZW1wbG95KSB8PgogIGdncGxvdChhZXMoeWVhciwgZmVtYWxlX3VuZW1wbG95KSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKSArCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9ICd5fngnLCBtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFKQpgYGAKCiMjIyDliIbluIMKCuODh+ODvOOCv+OBruaVsOOBi+OCieOAgeOBvuOBmuOBr+OAgTIwMjDlubTjgavjgaTjgYTjgabopovjgabjgb/jgovjgIIKCmBgYHtyfQpkZl9mZW1hbGVfdW5lbXBsb3kgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKCEoY291bnRyeSAlaW4lIFJFR0lPTikpfD4KICBkcm9wX25hKGZlbWFsZV91bmVtcGxveSkgfD4KICBnZ3Bsb3QoYWVzKGZlbWFsZV91bmVtcGxveSkpICsgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAyKQpgYGAKCioq5Y+C6ICD77yaKipTQUNVIOOBru+8leOCq+WbveOBruWApOOCkue4pue3muOBp+abuOOBjei+vOOCgOOBq+OBr+S4i+OBruOCiOOBhuOBq+OBl+OBvuOBmeOAggoKYGBge3J9CmRmX2ZlbWFsZV91bmVtcGxveSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSAKYGBgCgoqKuWPguiAg++8muaXpeacrOOBqCoqU0FDVSDjga7vvJXjgqvlm73jga7lgKTjgpLnuKbnt5rjgafmm7jjgY3ovrzjgoDjgavjga/kuIvjga7jgojjgYbjgavjgZfjgb7jgZnjgIIKCmBgYHtyfQpKUCA8LSAyLjUyMApTQUYgPC0gZGZfZmVtYWxlX3VuZW1wbG95IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIHw+IHB1bGwoZmVtYWxlX3VuZW1wbG95KQpkZl9mZW1hbGVfdW5lbXBsb3kgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKCEoY291bnRyeSAlaW4lIFJFR0lPTikpfD4KICBkcm9wX25hKGZlbWFsZV91bmVtcGxveSkgfD4KICBnZ3Bsb3QoKSArIGdlb21faGlzdG9ncmFtKGFlcyhmZW1hbGVfdW5lbXBsb3kpLCBiaW53aWR0aCA9IDIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBTQUYsIGNvbCA9ICJyZWQiKSArIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IEpQLCBjb2wgPSAiYmx1ZSIpICtsYWJzKHRpdGxlID0gIjIwMjDlubTjga7lpbPmgKfjga7msYLogbfnjociLCBzdWJ0aXRsZSA9ICLml6XmnKzvvJrpnZLjgIFTQUNV77ya6LWkIikKYGBgCgojIyMg44OH44O844K/44GM5Y2B5YiG44GC44KL5pyA6L+R44Gu5bm044Gu5YCk44GuMTDjgqvlm73jga7lgKTjga7mo5LjgrDjg6njg5UKCiMjIyMgYS4g5YCk44GM5aSn44GN44GE5pa544GL44KJCgpgYGB7cn0KZGZfZmVtYWxlX3VuZW1wbG95IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGRyb3BfbmEoZmVtYWxlX3VuZW1wbG95KSB8PiAKICBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpfD4KICBhcnJhbmdlKGRlc2MoZmVtYWxlX3VuZW1wbG95KSkgfD4gaGVhZCgxMCkgfD4gCiAgZ2dwbG90KGFlcyhmY3RfcmVvcmRlcihjb3VudHJ5LCBmZW1hbGVfdW5lbXBsb3kpLCBmZW1hbGVfdW5lbXBsb3kpKSArIGdlb21fY29sKCkgKyAKICBjb29yZF9mbGlwKCkgKyBsYWJzKHRpdGxlID0gIlRvcCAxMCBDb3VudHJpZXMiLCB4ID0gImNvdW50cnkiLCB5ID0gInVuZW1wbG95bWVudCByYXRlLCBmZW1hbGUsIDIwMjAiKQpgYGAKCiMjIyMgYi4g5YCk44GM5bCP44GV44GE5pa544GL44KJCgpgYGB7cn0KZGZfZmVtYWxlX3VuZW1wbG95IHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGRyb3BfbmEoZmVtYWxlX3VuZW1wbG95KSB8PiAKICBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpfD4KICBhcnJhbmdlKGZlbWFsZV91bmVtcGxveSkgfD4gaGVhZCgxMCkgfD4gCiAgZ2dwbG90KGFlcyhmY3RfcmV2KGZjdF9yZW9yZGVyKGNvdW50cnksIGZlbWFsZV91bmVtcGxveSkpLCBmZW1hbGVfdW5lbXBsb3kpKSArIGdlb21fY29sKCkgKyAKICBjb29yZF9mbGlwKCkgKyBsYWJzKHRpdGxlID0gIkxvd2VzdCAxMCBDb3VudHJpZXMiLCB4ID0gImNvdW50cnkiLCB5ID0gInVuZW1wbG95bWVudCByYXRlLCBmZW1hbGUsIDIwMjAiKQpgYGAKCiMg55S35oCn5aSx5qWt546HCgojIyDjg4fjg7zjgr8KCi0gICBVbmVtcGxveW1lbnQsIG1hbGUgKCUgb2YgbWFsZSBsYWJvciBmb3JjZSkgKG1vZGVsZWQgSUxPIGVzdGltYXRlKe+8mlNMLlVFTS5UT1RMLk1BLlpTIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NMLlVFTS5UT1RMLk1BLlpTKV0KCiMjIyDjg4fjg7zjgr/mg4XloLEKCi0gICDjg4fjg7zjgr/lkI3vvJoKCi0gICDjg4fjg7zjgr/jgrPjg7zjg4nvvJpTTC5VRU0uVE9UTC5NQS5aUwoKLSAgIOWkieaVsOWQje+8mm1hbGVfdW5lbXBsb3kKCi0gICDmpoLopoHvvJoKCiMjIyDjg4fjg7zjgr/jga7lj5blvpcKCiMjIyMg5rqW5YKZCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoV0RJKQpgYGAKCldESSDjg5Hjg4PjgrHjg7zjgrjjgpLkvb/jgaPjgabjgIHnm7TmjqXjg4fjg7zjgr/jgpLjg4Djgqbjg7Pjg63jg7zjg4njgZfjgIHlpInmlbDlkI3jgpLjgIFgZWRfZXhwYCDjgavmjIflrprjgIIKCmBgYHtyIGV2YWwgPSBGQUxTRX0KZGZfbWFsZV91bmVtcGxveSA8LSBXREkoaW5kaWNhdG9yID0gYyhtYWxlX3VuZW1wbG95ID0gIlNMLlVFTS5UT1RMLk1BLlpTIikpCmBgYAoKYGBge3IgZXZhbCA9IEZBTFNFfQp3cml0ZV9jc3YoZGZfbWFsZV91bmVtcGxveSwgImRhdGEvbWFsZV91bmVtcGxveS5jc3YiKQpgYGAKCmBgYHtyfQpkZl9tYWxlX3VuZW1wbG95IDwtIHJlYWRfY3N2KCJkYXRhL21hbGVfdW5lbXBsb3kuY3N2IikKYGBgCgojIyMg44OH44O844K/44Gu56K66KqNCgpgYGB7cn0KZGZfbWFsZV91bmVtcGxveQpgYGAKCmBgYHtyfQpzdHIoZGZfbWFsZV91bmVtcGxveSkKYGBgCgpgYGB7cn0KUkVHSU9OIDwtIGMoIjFBIiwgIjFXIiwgIjRFIiwgIjdFIiwgIjhTIiwgIkI4IiwgIkVVIiwgIkYxIiwgIk9FIiwgIlMxIiwgCiJTMiIsICJTMyIsICJTNCIsICJUMiIsICJUMyIsICJUNCIsICJUNSIsICJUNiIsICJUNyIsICJWMSIsICJWMiIsIAoiVjMiLCAiVjQiLCAiWEMiLCAiWEQiLCAiWEUiLCAiWEYiLCAiWEciLCAiWEgiLCAiWEkiLCAiWEoiLCAiWEwiLCAKIlhNIiwgIlhOIiwgIlhPIiwgIlhQIiwgIlhRIiwgIlhUIiwgIlhVIiwgIlhZIiwgIlo0IiwgIlo3IiwgIlpGIiwgCiJaRyIsICJaSCIsICJaSSIsICJaSiIsICJaUSIsICJaVCIpCmBgYAoKYGBge3J9CmRmX21hbGVfdW5lbXBsb3kgfD4gZmlsdGVyKGlzbzJjICVpbiUgUkVHSU9OKSB8PiBkaXN0aW5jdChjb3VudHJ5LCBpc28yYykKYGBgCgpgYGB7cn0KZGZfbWFsZV91bmVtcGxveSB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IGRpc3RpbmN0KGNvdW50cnksIGlzbzJjKQpgYGAKCiMjIyDliIbmnpDjgZnjgovlm73jga7jg6rjgrnjg4gKCiMjIyMgKirljZfpg6jjgqLjg5Xjg6rjgqvplqLnqI7lkIznm58qKiBUaGUgU291dGhlcm4gQWZyaWNhbiBDdXN0b21zIFVuaW9uIChTQUNVKQoKYGBge3J9ClNPVVRIX0FGUklDQV9GSVZFIDwtIGMoIlNvdXRoIEFmcmljYSIsICJOYW1pYmlhIiwgIkVzd2F0aW5pIiwgIkJvdHN3YW5hIiwgIkxlc290aG8iKQpgYGAKCiMjIyMg44Op44OG44Oz44Ki44Oh44Oq44Kr44Gn44K444OL5oyH5pWw44GM5aSn44GN44GE77yU44Kr5Zu9CgpgYGB7cn0KQ0hPU0VOX0NPVU5UUklFUyA8LSBjKCJTdXJpbmFtZSIsICJCZWxpemUiLCAiQnJhemlsIiwgIkNvbG9tYmlhIikKYGBgCgojIyDliIbmnpAKCiMjIyAxLiDlkITlubTmr47jga7jg4fjg7zjgr/jga7mlbDjga7mo5LjgrDjg6njg5UKCmBgYHtyfQpkZl9tYWxlX3VuZW1wbG95IHw+IGRyb3BfbmEobWFsZV91bmVtcGxveSkgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PgogIGdncGxvdChhZXMoeWVhcikpICsgZ2VvbV9iYXIoKQpgYGAKCiMjIOimluimmuWMlgoKIyMjIDIuIOaXpeacrOOBrueUt+aAp+WksealreeOhwoKYGBge3J9CmRmX21hbGVfdW5lbXBsb3kgfD4gZmlsdGVyKGNvdW50cnkgPT0gIkphcGFuIikgfD4gCiAgZHJvcF9uYShtYWxlX3VuZW1wbG95KSB8PiBhcnJhbmdlKGRlc2MoeWVhcikpCmBgYAoKIyMjIDMuIOe1jOW5tOWkieWMlgoKIyMjIyBhLiDml6XmnKwKCmBgYHtyfQpkZl9tYWxlX3VuZW1wbG95IHw+IGZpbHRlcihjb3VudHJ5ID09ICJKYXBhbiIpIHw+IGRyb3BfbmEobWFsZV91bmVtcGxveSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIG1hbGVfdW5lbXBsb3kpKSArIGdlb21fbGluZSgpCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSAgIDIwMDLlubTjgZTjgo3jgajjgIEKCi0gICAyMDE05bm044GU44KN44GL44KJ5rib5bCR44CBMjAxOOW5tOOBlOOCjeOBi+OCieWil+WKoOOAgTIwMjDlubTjgYvjgokyMDIx5bm044Gv5rib5bCR44CCCgojIyMjIGIuIOWNl+mDqOOCouODleODquOCq+mWoueojuWQjOebnwoKYGBge3J9CmRmX2VkX2V4cCB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSB8PiBkcm9wX25hKGVkX2V4cCkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIGVkX2V4cCkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkKYGBgCgoqKuWPguiAg++8muW5s+Wdh+eahOOBquWApOOCkuabsue3muOBp+ihqOOBmeOBk+OBqOOCguWPr+iDveOBp+OBmeOAgmxvZXNzIOOCkuS9v+OBhuOBqOa7keOCieOBi+OBquabsue3muOBp+i/keS8vOOBl+OBpuOBj+OCjOOBvuOBmeOAgioqCgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIHw+IGRyb3BfbmEoZWRfZXhwKSB8PgogIGdncGxvdChhZXMoeWVhciwgZWRfZXhwKSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKSArCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9ICd5fngnLCBtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCi0gICDlubPlnYfjgafopovjgovjgajjgIHkuIrmmIfjgZfjgabjgY3jgabjgYrjgorjgIE3JSDnqIvluqbjgajjgYTjgYblpKfjgY3jgarlibLlkIjjgavjgarjgaPjgabjgYTjgovjgIIKCiMjIyMgYy4g44Op44OG44Oz44Ki44Oh44Oq44Kr77yU44Kr5Zu9CgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgQ0hPU0VOX0NPVU5UUklFUykgfD4gZHJvcF9uYShlZF9leHApIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBlZF9leHApKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpCmBgYAoKKirlj4LogIPvvJrlubPlnYfnmoTjgarlgKTjgpLmm7Lnt5rjgafooajjgZnjgZPjgajjgoLlj6/og73jgafjgZnjgIJsb2VzcyDjgpLkvb/jgYbjgajmu5HjgonjgYvjgarmm7Lnt5rjgafov5HkvLzjgZfjgabjgY/jgozjgb7jgZnjgIIqKgoKYGBge3J9CmRmX2VkX2V4cCB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIENIT1NFTl9DT1VOVFJJRVMpIHw+IGRyb3BfbmEoZWRfZXhwKSB8PgogIGdncGxvdChhZXMoeWVhciwgZWRfZXhwKSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKSArCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9ICd5fngnLCBtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFKQpgYGAKCiMjIyDliIbluIMKCuODh+ODvOOCv+OBruaVsOOBi+OCieOAgeOBvuOBmuOBr+OAgTIwMjDlubTjgavjgaTjgYTjgabopovjgabjgb/jgovjgIIKCmBgYHtyfQpkZl9lZF9leHAgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKCEoY291bnRyeSAlaW4lIFJFR0lPTikpfD4KICBkcm9wX25hKGVkX2V4cCkgfD4KICBnZ3Bsb3QoYWVzKGVkX2V4cCkpICsgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxKQpgYGAKCioq5Y+C6ICD77yaKipTQUNVIOOBru+8leOCq+WbveOBruWApOOCkue4pue3muOBp+abuOOBjei+vOOCgOOBq+OBr+S4i+OBruOCiOOBhuOBq+OBl+OBvuOBmeOAggoKYGBge3J9CmRmX2VkX2V4cCB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIFNPVVRIX0FGUklDQV9GSVZFKSAKYGBgCgoqKuWPguiAg++8muaXpeacrOOBqCoqU0FDVSDjga7vvJXjgqvlm73jga7lgKTjgpLnuKbnt5rjgafmm7jjgY3ovrzjgoDjgavjga/kuIvjga7jgojjgYbjgavjgZfjgb7jgZnjgIIKCmBgYHtyfQpKUCA8LSAzLjQxNjk4MQpTQUYgPC0gZGZfZWRfZXhwIHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIHw+IHB1bGwoZWRfZXhwKQpkZl9lZF9leHAgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKCEoY291bnRyeSAlaW4lIFJFR0lPTikpfD4KICBkcm9wX25hKGVkX2V4cCkgfD4KICBnZ3Bsb3QoKSArIGdlb21faGlzdG9ncmFtKGFlcyhlZF9leHApLCBiaW53aWR0aCA9IDEpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBTQUYsIGNvbCA9ICJyZWQiKSArIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IEpQLCBjb2wgPSAiYmx1ZSIpICtsYWJzKHRpdGxlID0gIjIwMjDlubTjga7mlZnogrLosrvjga7lr75HRFDnmb7liIbnjociLCBzdWJ0aXRsZSA9ICLml6XmnKzvvJrpnZLjgIFTQUNV77ya6LWkIikKYGBgCgojIyMg44OH44O844K/44GM5Y2B5YiG44GC44KL5pyA6L+R44Gu5bm044Gu5YCk44GuMTDjgqvlm73jga7lgKTjga7mo5LjgrDjg6njg5UKCiMjIyMgYS4g5YCk44GM5aSn44GN44GE5pa544GL44KJCgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGRyb3BfbmEoZWRfZXhwKSB8PiAKICBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpfD4KICBhcnJhbmdlKGRlc2MoZWRfZXhwKSkgfD4gaGVhZCgxMCkgfD4gCiAgZ2dwbG90KGFlcyhmY3RfcmVvcmRlcihjb3VudHJ5LCBlZF9leHApLCBlZF9leHApKSArIGdlb21fY29sKCkgKyAKICBjb29yZF9mbGlwKCkgKyBsYWJzKHRpdGxlID0gIlRvcCAxMCBDb3VudHJpZXMiLCB4ID0gImNvdW50cnkiLCB5ID0gIkdvdmVybm1lbnQgZXhwZW5kaXR1cmUgb24gZWR1Y2F0aW9uLCB0b3RhbCAoJSBvZiBHRFApIikKYGBgCgojIyMjIGIuIOWApOOBjOWwj+OBleOBhOaWueOBi+OCiQoKYGBge3J9CmRmX2VkX2V4cCB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBkcm9wX25hKGVkX2V4cCkgfD4gCiAgZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKXw+CiAgYXJyYW5nZShlZF9leHApIHw+IGhlYWQoMTApIHw+IAogIGdncGxvdChhZXMoZmN0X3JldihmY3RfcmVvcmRlcihjb3VudHJ5LCBlZF9leHApKSwgZWRfZXhwKSkgKyBnZW9tX2NvbCgpICsgCiAgY29vcmRfZmxpcCgpICsgbGFicyh0aXRsZSA9ICJMb3dlc3QgMTAgQ291bnRyaWVzIiwgeCA9ICJjb3VudHJ5IiwgeSA9ICJHb3Zlcm5tZW50IGV4cGVuZGl0dXJlIG9uIGVkdWNhdGlvbiwgdG90YWwgKCUgb2YgR0RQKSIpCmBgYAoKIyAxMC4gIOiyoOWCteeOhwoKIyMg44OH44O844K/CgotICAgTmV0IG9mZmljaWFsIGRldmVsb3BtZW50IGFzc2lzdGFuY2UgYW5kIG9mZmljaWFsIGFpZCByZWNlaXZlZCAoY3VycmVudCBVU1wkKSBEVC5PREEuQUxMRC5DRCBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9EVC5PREEuQUxMRC5DRCldCgojIyMg44OH44O844K/5oOF5aCxCgotICAg44OH44O844K/5ZCN77yaCgotICAg44OH44O844K/44Kz44O844OJ77yaCgotICAg5aSJ5pWw5ZCN77yaCgotICAg5qaC6KaB77yaCgojIyMg44OH44O844K/44Gu5Y+W5b6XCgojIyMjIOa6luWCmQoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KFdESSkKYGBgCgpXREkg44OR44OD44Kx44O844K444KS5L2/44Gj44Gm44CB55u05o6l44OH44O844K/44KS44OA44Km44Oz44Ot44O844OJ44GX44CB5aSJ5pWw5ZCN44KS44CBYGVkX2V4cGAg44Gr5oyH5a6a44CCCgpgYGB7ciBldmFsID0gRkFMU0V9CmRmX2VkX2V4cCA8LSBXREkoaW5kaWNhdG9yID0gYyhlZF9leHAgPSAiU0UuWFBELlRPVEwuR0QuWlMiKSkKYGBgCgpgYGB7ciBldmFsID0gRkFMU0V9CndyaXRlX2NzdihkZl9lZF9leHAsICJkYXRhL2VkX2V4cC5jc3YiKQpgYGAKCmBgYHtyfQpkZl9lZF9leHAgPC0gcmVhZF9jc3YoImRhdGEvZWRfZXhwLmNzdiIpCmBgYAoKIyMjIOODh+ODvOOCv+OBrueiuuiqjQoKYGBge3J9CmRmX2VkX2V4cApgYGAKCmBgYHtyfQpzdHIoZGZfZWRfZXhwKQpgYGAKCmBgYHtyfQpSRUdJT04gPC0gYygiMUEiLCAiMVciLCAiNEUiLCAiN0UiLCAiOFMiLCAiQjgiLCAiRVUiLCAiRjEiLCAiT0UiLCAiUzEiLCAKIlMyIiwgIlMzIiwgIlM0IiwgIlQyIiwgIlQzIiwgIlQ0IiwgIlQ1IiwgIlQ2IiwgIlQ3IiwgIlYxIiwgIlYyIiwgCiJWMyIsICJWNCIsICJYQyIsICJYRCIsICJYRSIsICJYRiIsICJYRyIsICJYSCIsICJYSSIsICJYSiIsICJYTCIsIAoiWE0iLCAiWE4iLCAiWE8iLCAiWFAiLCAiWFEiLCAiWFQiLCAiWFUiLCAiWFkiLCAiWjQiLCAiWjciLCAiWkYiLCAKIlpHIiwgIlpIIiwgIlpJIiwgIlpKIiwgIlpRIiwgIlpUIikKYGBgCgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcihpc28yYyAlaW4lIFJFR0lPTikgfD4gZGlzdGluY3QoY291bnRyeSwgaXNvMmMpCmBgYAoKYGBge3J9CmRmX2VkX2V4cCB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IGRpc3RpbmN0KGNvdW50cnksIGlzbzJjKQpgYGAKCiMjIyDliIbmnpDjgZnjgovlm73jga7jg6rjgrnjg4gKCiMjIyMgKirljZfpg6jjgqLjg5Xjg6rjgqvplqLnqI7lkIznm58qKiBUaGUgU291dGhlcm4gQWZyaWNhbiBDdXN0b21zIFVuaW9uIChTQUNVKQoKYGBge3J9ClNPVVRIX0FGUklDQV9GSVZFIDwtIGMoIlNvdXRoIEFmcmljYSIsICJOYW1pYmlhIiwgIkVzd2F0aW5pIiwgIkJvdHN3YW5hIiwgIkxlc290aG8iKQpgYGAKCiMjIyMg44Op44OG44Oz44Ki44Oh44Oq44Kr44Gn44K444OL5oyH5pWw44GM5aSn44GN44GE77yU44Kr5Zu9CgpgYGB7cn0KQ0hPU0VOX0NPVU5UUklFUyA8LSBjKCJTdXJpbmFtZSIsICJCZWxpemUiLCAiQnJhemlsIiwgIkNvbG9tYmlhIikKYGBgCgojIyDliIbmnpAKCiMjIyAxLiDlkITlubTmr47jga7jg4fjg7zjgr/jga7mlbDjga7mo5LjgrDjg6njg5UKCmBgYHtyfQpkZl9lZF9leHAgfD4gZHJvcF9uYShlZF9leHApIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIpKSArIGdlb21fYmFyKCkKYGBgCgojIyDoppbopprljJYKCiMjIyAyLiDml6XmnKzjga7mlZnogrLosrvvvIglIG9mIEdEUO+8iQoKYGBge3J9CmRmX2VkX2V4cCB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PiAKICBkcm9wX25hKGVkX2V4cCkgfD4gYXJyYW5nZShkZXNjKHllYXIpKQpgYGAKCiMjIyAzLiDntYzlubTlpInljJYKCiMjIyMgYS4g5pel5pysCgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcihjb3VudHJ5ID09ICJKYXBhbiIpIHw+IGRyb3BfbmEoZWRfZXhwKSB8PgogIGdncGxvdChhZXMoeWVhciwgZWRfZXhwKSkgKyBnZW9tX2xpbmUoKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCi0gICAxOTcw5bm05Luj44Gu5oCl5r+A44Gq5LiK5piH44CBMTk5MOW5tOOBlOOCjeOBruaApea/gOOBquePvuixoeOBr+OAgeS9leOBjOWOn+WboOOBquOBruOBoOOCjeOBhuOAggoKLSAgIDIwMTTlubTjgZTjgo3jgYvjgonmuJvlsJHjgIEyMDE45bm044GU44KN44GL44KJ5aKX5Yqg44CBMjAyMOW5tOOBi+OCiTIwMjHlubTjga/muJvlsJHjgIIKCiMjIyMgYi4g5Y2X6YOo44Ki44OV44Oq44Kr6Zai56iO5ZCM55ufCgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIHw+IGRyb3BfbmEoZWRfZXhwKSB8PgogIGdncGxvdChhZXMoeWVhciwgZWRfZXhwKSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKQpgYGAKCioq5Y+C6ICD77ya5bmz5Z2H55qE44Gq5YCk44KS5puy57ea44Gn6KGo44GZ44GT44Go44KC5Y+v6IO944Gn44GZ44CCbG9lc3Mg44KS5L2/44GG44Go5ruR44KJ44GL44Gq5puy57ea44Gn6L+R5Ly844GX44Gm44GP44KM44G+44GZ44CCKioKCmBgYHtyfQpkZl9lZF9leHAgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gZHJvcF9uYShlZF9leHApIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBlZF9leHApKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpICsKICBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3l+eCcsIG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UpCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSAgIOW5s+Wdh+OBp+imi+OCi+OBqOOAgeS4iuaYh+OBl+OBpuOBjeOBpuOBiuOCiuOAgTclIOeoi+W6puOBqOOBhOOBhuWkp+OBjeOBquWJsuWQiOOBq+OBquOBo+OBpuOBhOOCi+OAggoKIyMjIyBjLiDjg6njg4bjg7PjgqLjg6Hjg6rjgqvvvJTjgqvlm70KCmBgYHtyfQpkZl9lZF9leHAgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBDSE9TRU5fQ09VTlRSSUVTKSB8PiBkcm9wX25hKGVkX2V4cCkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIGVkX2V4cCkpICsgZ2VvbV9saW5lKGFlcyhjb2wgPSBjb3VudHJ5KSkKYGBgCgoqKuWPguiAg++8muW5s+Wdh+eahOOBquWApOOCkuabsue3muOBp+ihqOOBmeOBk+OBqOOCguWPr+iDveOBp+OBmeOAgmxvZXNzIOOCkuS9v+OBhuOBqOa7keOCieOBi+OBquabsue3muOBp+i/keS8vOOBl+OBpuOBj+OCjOOBvuOBmeOAgioqCgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgQ0hPU0VOX0NPVU5UUklFUykgfD4gZHJvcF9uYShlZF9leHApIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBlZF9leHApKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpICsKICBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3l+eCcsIG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UpCmBgYAoKIyMjIOWIhuW4gwoK44OH44O844K/44Gu5pWw44GL44KJ44CB44G+44Ga44Gv44CBMjAyMOW5tOOBq+OBpOOBhOOBpuimi+OBpuOBv+OCi+OAggoKYGBge3J9CmRmX2VkX2V4cCB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoIShjb3VudHJ5ICVpbiUgUkVHSU9OKSl8PgogIGRyb3BfbmEoZWRfZXhwKSB8PgogIGdncGxvdChhZXMoZWRfZXhwKSkgKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEpCmBgYAoKKirlj4LogIPvvJoqKlNBQ1Ug44Gu77yV44Kr5Zu944Gu5YCk44KS57im57ea44Gn5pu444GN6L6844KA44Gr44Gv5LiL44Gu44KI44GG44Gr44GX44G+44GZ44CCCgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIApgYGAKCioq5Y+C6ICD77ya5pel5pys44GoKipTQUNVIOOBru+8leOCq+WbveOBruWApOOCkue4pue3muOBp+abuOOBjei+vOOCgOOBq+OBr+S4i+OBruOCiOOBhuOBq+OBl+OBvuOBmeOAggoKYGBge3J9CkpQIDwtIDMuNDE2OTgxClNBRiA8LSBkZl9lZF9leHAgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gcHVsbChlZF9leHApCmRmX2VkX2V4cCB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoIShjb3VudHJ5ICVpbiUgUkVHSU9OKSl8PgogIGRyb3BfbmEoZWRfZXhwKSB8PgogIGdncGxvdCgpICsgZ2VvbV9oaXN0b2dyYW0oYWVzKGVkX2V4cCksIGJpbndpZHRoID0gMSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IFNBRiwgY29sID0gInJlZCIpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gSlAsIGNvbCA9ICJibHVlIikgK2xhYnModGl0bGUgPSAiMjAyMOW5tOOBruaVmeiCsuiyu+OBruWvvkdEUOeZvuWIhueOhyIsIHN1YnRpdGxlID0gIuaXpeacrO+8mumdkuOAgVNBQ1XvvJrotaQiKQpgYGAKCiMjIyDjg4fjg7zjgr/jgYzljYHliIbjgYLjgovmnIDov5Hjga7lubTjga7lgKTjga4xMOOCq+WbveOBruWApOOBruajkuOCsOODqeODlQoKIyMjIyBhLiDlgKTjgYzlpKfjgY3jgYTmlrnjgYvjgokKCmBgYHtyfQpkZl9lZF9leHAgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZHJvcF9uYShlZF9leHApIHw+IAogIGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSl8PgogIGFycmFuZ2UoZGVzYyhlZF9leHApKSB8PiBoZWFkKDEwKSB8PiAKICBnZ3Bsb3QoYWVzKGZjdF9yZW9yZGVyKGNvdW50cnksIGVkX2V4cCksIGVkX2V4cCkpICsgZ2VvbV9jb2woKSArIAogIGNvb3JkX2ZsaXAoKSArIGxhYnModGl0bGUgPSAiVG9wIDEwIENvdW50cmllcyIsIHggPSAiY291bnRyeSIsIHkgPSAiR292ZXJubWVudCBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24sIHRvdGFsICglIG9mIEdEUCkiKQpgYGAKCiMjIyMgYi4g5YCk44GM5bCP44GV44GE5pa544GL44KJCgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGRyb3BfbmEoZWRfZXhwKSB8PiAKICBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpfD4KICBhcnJhbmdlKGVkX2V4cCkgfD4gaGVhZCgxMCkgfD4gCiAgZ2dwbG90KGFlcyhmY3RfcmV2KGZjdF9yZW9yZGVyKGNvdW50cnksIGVkX2V4cCkpLCBlZF9leHApKSArIGdlb21fY29sKCkgKyAKICBjb29yZF9mbGlwKCkgKyBsYWJzKHRpdGxlID0gIkxvd2VzdCAxMCBDb3VudHJpZXMiLCB4ID0gImNvdW50cnkiLCB5ID0gIkdvdmVybm1lbnQgZXhwZW5kaXR1cmUgb24gZWR1Y2F0aW9uLCB0b3RhbCAoJSBvZiBHRFApIikKYGBgCg==